- 締切済み
MySQLでJOINを使った検索について
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です。 よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- yamada_g
- ベストアンサー率68% (258/374)
SELECT * FROM `item` WHERE NOT EXISTS ( SELECT * FROM `useritem` WHERE `item`.`itemid` = `useritem`.`itemid` AND `useritem`.`userid` = 1 AND `useritem`.`count` > 0 ); でどうでしょうか。
- bin-chan
- ベストアンサー率33% (1403/4213)
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