私は化学分析を保存するためにmysqlを使用しています。そして結果をhtml/phpでフィルタリングし、私が望む結果を取得するためのクエリを生成します。今は複雑になってきて、すべてのフィルタを適用するためにテーブルに自己結合しようとしています。複数条件付き自己結合
私のテーブルdesingは50k以上の行のようです。
+--------+---------+-------------+----------------+
| Column | Type | Index | |
+--------+---------+-------------+----------------+
| RID | int | primary_key | auto increment |
| ID | int | index | |
| Type | int | | |
| Order | int | | |
| Num | int | | |
| Val1 | decimal | | |
| Val2 | decimal | | |
+--------+---------+-------------+----------------+
すべてのサンプルは、ID、異なる種類と順を持っています。 Val1およびVal2は、の数字タイプの結果である。今は42のNumがあります。例えば
私のフィルタは、そのようにしている場合、
Select Types (1,3,9)
Select ANum (0,5)
Type 1, Num 5 should be bigger than 10 In Val2
Type 1, Num 5, should be smaller than 30 In Val2
Type 3, Num 0, should be smaller than 8 In Val1
私は結果を生成するために、そのクエリを使用しています。
SELECT analyse.* FROM analyse
INNER JOIN
(SELECT ID FROM analyse WHERE Type = 1 AND Num = 5 AND Val2 < 30) AS a1 ON a1.SID = analyse.SID
INNER JOIN
(SELECT SID FROM WHERE Type = 1 AND Num = 5 AND Val2 > 10) AS a2 ON a2.SID = analyse.SID
INNER JOIN
(SELECT SID FROM analyse WHERE Type = 3 AND Num = 0 AND Val1 > 8) AS a3 ON a2.SID = analyse.SID
WHERE Type IN (1,3,9) AND Num IN (0,5) ORDER BY ID, Type, Order, Num ASC
+-----+------+-------+---------------+--------------+--------------+--------------+
| ID | Type | Order | Val1[Num[0]] | Val2[Num[0]] | Val1[Num[5]] | Val2[Num[5]] |
+-----+------+-------+---------------+--------------+--------------+--------------+
| ... | ... | ... | ... | ... | ... | ... |
| 118 | 1 | 1 | 10.9000 | 2.2083 | 3.5056 | 15.2627 |
| 118 | 1 | 2 | 9.5000 | 1.9246 | 2.0305 | 11.7049 |
| 118 | 1 | 3 | 7.9000 | 1.6005 | 2.4274 | 16.6597 |
| 118 | 2 | 1 | 10.9000 | 2.2083 | 3.5056 | 15.2627 |
| 118 | 3 | 2 | 20.4000 | 4.1329 | 2.8187 | 22.9676 |
| 118 | 4 | 3 | 28.3000 | 5.7334 | 2.7094 | 29.6273 |
| 119 | 1 | 1 | 27.2000 | 6.8635 | 0.5506 | 14.9084 |
| 119 | 1 | 2 | 25.9000 | 6.5355 | 0.4249 | 10.9550 |
| 119 | 3 | 1 | 27.2000 | 6.8635 | 0.5506 | 14.9084 |
| 119 | 3 | 2 | 53.1000 | 13.3989 | 0.4893 | 25.8634 |
| ... | ... | ... | ... | ... | ... | ... |
+-----+------+-------+---------------+--------------+--------------+--------------+
このように出力する必要があります。しかし、他のVal1とVal2の値が同じID、同じタイプであるが、順序が異なるため、INNER JOINは期待通りに機能しません。私のフィルタよりも大きい値と小さい値が表示されます。それらのうちのいくつかは決して示されなかった。
申し訳ありませんが長すぎる場合。私は正しい文章や構造を見つけることができません。何かアドバイス?
編集:申し訳ありません。他のすべてのデータをIDで表示する必要があることは忘れていました。だからこそ、私はjoinを使うつもりです。
あなたが構造を一覧表示したり、それは...あなたはあなたのwhere句で「STYPE」を参照したデータであることができます。また、 "ID"単位で結果を探していますか?各化学分析は特定のORDERで期待されますか?条件1のような条件は、条件2の前に見つけなければならず、条件3のために等しくなければならないか? 3つの基準すべてが満たされているものから、それらはあなたが望む最終記録ですか? – DRapp
@DRapp STypeが誤って書き込まれるように、ここにクエリを書きました。それは "タイプ"です。私が言ったように、IDのすべてのデータが必要です。これはフィルタを通過します。例として、「タイプ1、数字5が20 val2より小さい」、29.62、22,96の条件がVal2に対してまだ表示されている場合。パラメータがあるので、ID 118のフィルタを渡します。 – tuze