[前][次][番号順一覧][スレッド一覧]

mysql:16581

From: (Hisamitsu Issei) <<DS1I-HSMT@xxxxxxxxxx>>
Date: 28 Apr 2020 18:18:41 +0900
Subject: [mysql 16581] $B$b$C$H$$$$(BSQL$BJ8$O$J$$$+(B

久光と申します


phpからMySQLに検索をかけているスクリプトの一部に強引なやりかたのせいもあって検索に時間がかかっている部分があります。
とりあえず動いてはいるのですが、
もっとスマートで高速に検索できるSQLの書き方があるのではないかと相談させていただきます。

(1)容器に関する情報をまとめたテーブル
(2)容器の中に入っている物品の名前を記録したテーブル
が存在したとします。

容器テーブル
=========
容器ID 材質 色
=========
1 PET 黒
2 PET 無色透明
3 ガラス 無色透明
4 ガラス 黄色透明
5 塩ビ 白
=========

内容物テーブル
========
容器ID 内容物名
========
1 りんご
2 りんご
3 りんご
4 りんご
2 みかん
4 みかん
5 みかん
1 梨
2 梨
4 梨
========

実際には、上記の容器テーブルに相当する実際のテーブルは7万行ほどあり、内容物テーブルに相当する実際のテーブルは150万行ほどあるデータです。

SQLの書き方に悩んでいるのは、
「りんごと梨の両方が入っている無色透明の容器」のような、複数の内容物を全て含む該当容器を探すときです。
現在は、phpのfor文でいったん
SELECT `容器ID` FROM `内容物` WHERE `内容物名` = 'りんご'
SELECT `容器ID` FROM `内容物` WHERE `内容物名` = '梨'
と検索を繰り返して、得られた結果を整理して該当する容器IDを配列にまとめた上で、最後に
SELECT * FROM `容器` WHERE `色` = '無色透明' AND ( `容器ID`=2 OR `容器ID`=4 ... )
というように 容器テーブル を検索する方法をとってます。
条件によっては( `容器ID`=2 OR `容器ID`=4 ... ) の部分が数千から数万もの数になることもあり、
inner joinやleft joinなどの結合やUNIONなどなにかもっとスマートに高速に検索できるSQLの書き方があるんじゃないかと思うのですが
どうでしょうか。

「りんごまたは梨」のor検索なら容器テーブルと内容物テーブルをleft joinして容器IDでgroup byすればいいと思うのですが
「りんごと梨」のand検索となると、どうしていいのかわからなくなってます。


[前][次][番号順一覧][スレッド一覧]

->   16581 2020-04-28 18:18 [<DS1I-HSMT@xxxxxxxxx] $B$b$C$H$$$$(BSQL$BJ8$O$J$$$+(B     
     16582 2020-04-28 19:18 ┗["SAKAI, Kei" <sakaik] Re: [mysql 16581] もっといいSQL文はないか