- ベストアンサー
MySQL + PHPで同じテーブルを対象にした複雑なクエリ
- MySQLとPHPを使用して複雑なクエリを実行する際に、同じテーブルを対象にした処理が必要です。
- 具体的には、自分が所有している果物と、他のユーザーが持っている同じ果物を出力する処理が必要です。
- これを実現するために、サブクエリを使用する方法も考えられますが、うまく結果が得られない場合もあります。どのようなSQL文を使用すれば良いでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
テーブルの形がよくないので、以下のように作り直ししたとします。 CREATE TABLE user ( id int(10) unsigned NOT NULL auto_increment, name varchar(15) NOT NULL default 'no name', PRIMARY KEY (id) ) DEFAULT CHARSET=utf8; CREATE TABLE item ( id int(10) unsigned NOT NULL auto_increment, name varchar(15) NOT NULL default 'no name', PRIMARY KEY (id) ) DEFAULT CHARSET=utf8; CREATE TABLE owner ( id int(10) unsigned NOT NULL auto_increment, user_id int(10) unsigned NOT NULL, item_id int(10) unsigned NOT NULL, count int(10) unsigned NOT NULL, PRIMARY KEY (id), KEY (user_id), KEY (item_id) ) DEFAULT CHARSET=utf8; +--+--------+ | id .| name . | +--+--------+ | 1 | タロウ | | 2 | ヨシコ | | 3 | シゲル | | 4 | マユミ | +--+--------+ +--+--------+ | id .| name . | +--+--------+ | 1 | パイン .| | 2 | みかん | | 3 | メロン | | 4 | リンゴ | | 5 | イチゴ | | 6 | グレープ | | 7 | キウイ .| +--+--------+ +--+------.+------+-----+ | id .| user_id | item_id | count | +--+------.+------+-----+ | 1 | 1 | 1 | 1 | | 2 | 1 | 2 | 1 | | 3 | 1 | 3 | 1 | (略) SELECT user.name AS もらう人, (SELECT u.name FROM user AS u WHERE owner.user_id = u.id) AS あげる人, (SELECT item.name FROM item WHERE owner.item_id = item.id) AS もらうアイテム FROM user, owner WHERE user.id != owner.user_id AND owner.count > 0 AND owner.item_id NOT IN (SELECT o1.item_id FROM owner AS o1 WHERE user.id = o1.user_id) AND owner.user_id IN (SELECT DISTINCT o2.user_id FROM owner AS o1, owner AS o2 WHERE o1.user_id != o2.user_id AND o1.item_id = o2.item_id AND o1.user_id = user.id) ORDER BY user.id 多分これで目的にあってると思います。 +-------------+------------+---------------------+ | もらう人 | あげる人 | もらうアイテム . | +-------------+------------+---------------------+ | タロウ | ヨシコ | イチゴ | | タロウ | ヨシコ | リンゴ | | タロウ | マユミ .| リンゴ | | ヨシコ | タロウ | パイン .| | ヨシコ | タロウ | メロン | | ヨシコ | シゲル | キウイ | | ヨシコ | マユミ | メロン | | ヨシコ | シゲル | グレープ | | シゲル | ヨシコ | リンゴ | | シゲル | ヨシコ | みかん | | マユミ | ヨシコ | イチゴ | | マユミ | タロウ .| パイン . | +-------------+------------+---------------------+ 12 rows in set (0.01 sec)
その他の回答 (2)
No1 へのお礼と入れ違えてしまいました。始めの質問だけ見て解答を書いてしまいました。テーブルを作り直す所はいらなかったですね。 果物だけのマスタがあるようなので、このまま適用できると思います。(テーブル名などは書き換える必要がありますが)
- yambejp
- ベストアンサー率51% (3827/7415)
このテーブル構造で確定という前提でしょうか? 正直SQLとしてはかなりだめな部類の書き方をしています。 (たとえば、IDとは普通ユニークなキーに割り当てるものですが、 IDとしているにもかかわらず、今回の命題は冗長なデータの持ち方を しています) テーブル構造を見直せばだいぶ検索性もあがると思います
お礼
ありがとうございます。 一部説明を省略してしまっておりましたが、 実際は「果物テーブル」が別にありました。 つまり、 k_id|k_name| 1|パイン| 2|みかん| 3|メロン| 4|リンゴ| ・・・ と、果物が別マスタで管理されており、 「所有果物テーブル」は全て数値のみのデータとなっています。 ということでテーブル構成としては、 「ユーザーマスタ」 「果物マスタ」 「どのユーザーがどの果物を持っているか」 という構成になっています。 また細かいですが、所有果物テーブル内のuser_idはgoods_user_idというフィールド名でした。 このテーブル構成では、望んでいるクエリを行うことは難しいということでしょうか。。
お礼
ありがとうございます!! 見易いようにお気遣いもいただき感謝しております! 後ほど検証結果を報告させいただきます。 取り急ぎお礼まで。
補足
ephysさん、いただいた内容で実際にやってみたところ、 見事に求めていたデータが出力されました! ありがとうございました! しっかり理解して今後に活かしたいと思います。 本当にありがとうございました!