みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

最初に挿入された行だけ取得したい

このジャンルでお願いします。
次のようなテーブルで

CREATE TABLE IF NOT EXISTS user (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(32) NOT NULL,
PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO user (name) VALUES ('user1');
INSERT INTO user (name) VALUES ('user2');
INSERT INTO user (name) VALUES ('user3');

CREATE TABLE IF NOT EXISTS item (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(32) NOT NULL,
PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO item (name) VALUES ('item1');
INSERT INTO item (name) VALUES ('item2');
INSERT INTO item (name) VALUES ('item3');

CREATE TABLE IF NOT EXISTS user_item (
id int(11) NOT NULL AUTO_INCREMENT,
user_id INT,
item_id INT,
PRIMARY KEY(id),
FOREIGN KEY (item_id) REFERENCES user(id) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (user_id) REFERENCES item(id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO user_item (user_id, item_id) VALUES (1, 1);
INSERT INTO user_item (user_id, item_id) VALUES (2, 1);
INSERT INTO user_item (user_id, item_id) VALUES (3, 2);
INSERT INTO user_item (user_id, item_id) VALUES (1, 2);
INSERT INTO user_item (user_id, item_id) VALUES (1, 3);
INSERT INTO user_item (user_id, item_id) VALUES (3, 3);

user_itemテーブルでのselectで、
user_idが1で一番最初に挿入された行だけ
を取得したいのですが、どのようなSQL文にすれば良いのでしょうか?
この例なら

INSERT INTO user_item (user_id, item_id) VALUES (1, 1);←取得
INSERT INTO user_item (user_id, item_id) VALUES (2, 1);
INSERT INTO user_item (user_id, item_id) VALUES (3, 2);
INSERT INTO user_item (user_id, item_id) VALUES (1, 2);←user_id=3が最初に挿入されているので取得しない
INSERT INTO user_item (user_id, item_id) VALUES (1, 3);←取得
INSERT INTO user_item (user_id, item_id) VALUES (3, 3);

投稿日時 - 2014-08-27 12:38:07

QNo.8732272

すぐに回答ほしいです

質問者が選んだベストアンサー

よくあるランク付けの方法を応用すればよいでしょう。

まず、id順でitem_idごとにランクをつけます

SELECT id,user_id,item_id,(
SELECT COUNT(DISTINCT id) +1
FROM user_item AS t2
WHERE 1
AND t1.id > t2.id
AND t1.item_id=t2.item_id
) AS rank
FROM `user_item` AS t1;

これを元に、user_idが1、rankが1のものを抽出します。
なお上記rank項目はHAVING句に移動します

SELECT id,user_id,item_id
FROM `user_item` AS t1
WHERE user_id=1
HAVING (
SELECT COUNT(DISTINCT id) +1
FROM user_item as t2
WHERE 1
AND t1.id > t2.id
AND t1.item_id=t2.item_id
)=1;

投稿日時 - 2014-08-27 13:34:01

お礼

ご回答有難うございます。
そのやり方でできました。
参考になりました。

投稿日時 - 2014-08-27 16:00:29

ANo.1

このQ&Aは役に立ちましたか?

10人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問