2016-06-13 25 views
0

私は化学分析を保存するために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を使うつもりです。

+0

あなたが構造を一覧表示したり、それは...あなたはあなたのwhere句で「STYPE」を参照したデータであることができます。また、 "ID"単位で結果を探していますか?各化学分析は特定のORDERで期待されますか?条件1のような条件は、条件2の前に見つけなければならず、条件3のために等しくなければならないか? 3つの基準すべてが満たされているものから、それらはあなたが望む最終記録ですか? – DRapp

+0

@DRapp STypeが誤って書き込まれるように、ここにクエリを書きました。それは "タイプ"です。私が言ったように、IDのすべてのデータが必要です。これはフィルタを通過します。例として、「タイプ1、数字5が20 val2より小さい」、29.62、22,96の条件がVal2に対してまだ表示されている場合。パラメータがあるので、ID 118のフィルタを渡します。 – tuze

答えて

0

私は別の結合でそれらをフェッチするのではなく、同じNumとTypesを一緒に照会することで私の問題を解決しました。このようにして、同じNumとTypeの他のデータはフィルタを通過できません。

条件

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 AND Val2 > 10) AS a1 ON a1.SID = analyse.SID 
(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 
0

ので、テーブルの上にあなたの条件を評価する必要がある基本的に4つの異なるのcriteriasをだ

Select Types (1,3,9) 
Select Num (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 

である(タイプは、numが、VAL1、VAL2)

は、 "より良い" 解決策があるかもしれませんが(パフォーマンスの点で、またはコードを読みやすくするために)最も簡単なアプローチは、条件の明確なペアを作成することです。これは、何百万というレコードを処理しない限りうまくいくはずです。

SELECT * FROM analyse WHERE Type = 1 AND Num = 5 AND Val2 > 10 
UNION 
SELECT * FROM analyse WHERE Type = 1 AND Num = 5 AND Val2 < 10 
UNION 
SELECT * FROM analyse WHERE Type = 3 AND Num = 0 AND Val1 < 8 
UNION 
SELECT * FROM analyse WHERE Type = 9 
:「4明示的な」クエリの労働組合であろうと、そう

1.) Type = 1, Num = 5, Val2 > 10 
2.) Type = 1, Num = 5, Val2 < 30 
3.) Type = 3, Num = 0, Val1 < 8 
4.) Type = 9 

:あなたの条件のうち

、私は次の行セットをフェッチする必要があることderriveう

は、IDによって、最終的な結果をフィルタリングするには、単に使用することができます。

SELECT * FROM (
    SELECT * FROM analyse WHERE Type = 1 AND Num = 5 AND Val2 > 10 
    UNION 
    SELECT * FROM analyse WHERE Type = 1 AND Num = 5 AND Val2 < 10 
    UNION 
    SELECT * FROM analyse WHERE Type = 3 AND Num = 0 AND Val1 < 8 
    UNION 
    SELECT * FROM analyse WHERE Type = 9 
) as tempTable WHERE id = 118 
  • またはそれぞれの独立したクエリにidを追加するだけです。
+0

返信いただきありがとうございます。私は言及するのを忘れたと思う。他のすべてのデータはフィルタリングされたIDで表示する必要があります。 – tuze

+0

@tuze私の編集を参照してください – dognose

+0

ありがとう、私はしようとします。 – tuze