重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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

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);

A 回答 (1件)

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



まず、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;
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/08/27 16:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す