• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:MySQL + PHP 同じテーブルを対象にした複雑なクエリ)

MySQL + PHPで同じテーブルを対象にした複雑なクエリ

このQ&Aのポイント
  • MySQLとPHPを使用して複雑なクエリを実行する際に、同じテーブルを対象にした処理が必要です。
  • 具体的には、自分が所有している果物と、他のユーザーが持っている同じ果物を出力する処理が必要です。
  • これを実現するために、サブクエリを使用する方法も考えられますが、うまく結果が得られない場合もあります。どのようなSQL文を使用すれば良いでしょうか?

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

  • ベストアンサー
noname#98692
noname#98692
回答No.2

テーブルの形がよくないので、以下のように作り直ししたとします。 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)

noname#98692
noname#98692
回答No.3

No1 へのお礼と入れ違えてしまいました。始めの質問だけ見て解答を書いてしまいました。テーブルを作り直す所はいらなかったですね。 果物だけのマスタがあるようなので、このまま適用できると思います。(テーブル名などは書き換える必要がありますが)

doomdoom
質問者

お礼

ありがとうございます!! 見易いようにお気遣いもいただき感謝しております! 後ほど検証結果を報告させいただきます。 取り急ぎお礼まで。

doomdoom
質問者

補足

ephysさん、いただいた内容で実際にやってみたところ、 見事に求めていたデータが出力されました! ありがとうございました! しっかり理解して今後に活かしたいと思います。 本当にありがとうございました!

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

このテーブル構造で確定という前提でしょうか? 正直SQLとしてはかなりだめな部類の書き方をしています。 (たとえば、IDとは普通ユニークなキーに割り当てるものですが、 IDとしているにもかかわらず、今回の命題は冗長なデータの持ち方を しています) テーブル構造を見直せばだいぶ検索性もあがると思います

doomdoom
質問者

お礼

ありがとうございます。 一部説明を省略してしまっておりましたが、 実際は「果物テーブル」が別にありました。 つまり、 k_id|k_name| 1|パイン| 2|みかん| 3|メロン| 4|リンゴ| ・・・ と、果物が別マスタで管理されており、 「所有果物テーブル」は全て数値のみのデータとなっています。 ということでテーブル構成としては、 「ユーザーマスタ」 「果物マスタ」 「どのユーザーがどの果物を持っているか」 という構成になっています。 また細かいですが、所有果物テーブル内のuser_idはgoods_user_idというフィールド名でした。 このテーブル構成では、望んでいるクエリを行うことは難しいということでしょうか。。

関連するQ&A