プロが教える店舗&オフィスのセキュリティ対策術

MySQLについて質問があります。

下記のような2テーブルがあります。

-----------------------------
・item
商品情報を格納。

・usersitem
ユーザーが所有している商品の個数を格納。
-----------------------------

この2つのテーブルから2つのリストを取り出したいと考えています。

【A】特定のユーザーが複数所有している商品の一覧
【B】特定のユーザーが所有していない商品の一覧

【A】は出来たのですが、【B】のSQL文がわかりません。
どうかご教授いただけませんでしょうか。


■テーブルを作成したSQL
-----------------------------
CREATE TABLE `test`.`item` (
`itemid` SERIAL NOT NULL DEFAULT NULL UNIQUE,
`itemname` VARCHAR( 256 )
);


CREATE TABLE `test`.`usersitem` (
`id` SERIAL NOT NULL DEFAULT NULL UNIQUE,
`userid` INT,
`itemid` INT,
`count` INT
);
-----------------------------

■【A】を実現したSQL
条件:userid「1」のユーザーがcount「2」以上の一覧。
-----------------------------
SELECT * FROM `item` LEFT JOIN `usersitem` ON (`item`.`itemid` = `usersitem`.`itemid`)
WHERE `usersitem`.`userid` = 1 AND `usersitem`.`count` >= 2
-----------------------------

■【B】を実現しようとしたが違っていたSQL
条件:userid「1」のユーザーがcount「0」以下、または登録されていない一覧。

-----------------------------
SELECT * FROM `item` LEFT JOIN `usersitem` ON (`item`.`itemid` = `usersitem`.`itemid`)
WHERE ( `usersitem`.`userid` = 1 AND `usersitem`.`count` <= 0 )
OR `usersitem`.`userid` != 1
-----------------------------
結果:
個数情報が登録されていない商品が表示されない。
違うユーザーの情報が表示されてしまう。


使用しているのは MySQL 5.5.29です。

よろしくお願いいたします。

A 回答 (2件)

JOINで無いとダメですか?



SELECT * FROM `item`
WHERE NOT EXISTS
(
SELECT * FROM `usersitem`
WHERE `item`.`itemid` = `usersitem`.`itemid`)
)

この回答への補足

素早い反応ありがとうございます。
試してみたのですがエラーが出てしまいました。

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') LIMIT 0, 30' at line 6

想像なのですが、これは「誰も登録していないアイテム」を
取り出す構文なのでしょうか?

だとしたら申し訳ありません。自分の質問が説明不足でした。
具体的なデータと、希望する出力結果は下記のようになります。

■itemテーブル

itemid | item1
-------+---------
1 | item1
2 | item2
3 | item3
4 | item4

■usersitemテーブル

id | userid | itemid | count
1 | 1 | 1 | 1 ←1個以上なので対象外
2 | 1 | 2 | 2 ←1個以上なので対象外
3 | 1 | 3 | 0 ←【0個なので該当】
4 | 2 | 1 | 10 ←ユーザーIDが違うので対象外
5 | 2 | 4 | 1 ←ユーザーIDが違うので対象外

この他に、userid「1」は「item4」の登録がないので、それも該当。

■希望する結果
userid「1」は下記の商品を持っていない。

itemid | item1
-------+---------
3 | item3
4 | item4

補足日時:2013/05/08 22:36
    • good
    • 0

SELECT *


FROM `item`
WHERE NOT EXISTS (
SELECT *
FROM `useritem`
WHERE `item`.`itemid` = `useritem`.`itemid`
AND `useritem`.`userid` = 1
AND `useritem`.`count` > 0
);

でどうでしょうか。
    • good
    • 0

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