2016-06-13 50 views
0

我正在使用mysql來存儲我的化學分析。並用html/php過濾結果並生成查詢以獲取我想要的結果。現在事情變得越來越複雜了,我試圖自己加入表格來應用所有的過濾器。自我加入多個條件

我的餐桌設計就像超過50k行。

+--------+---------+-------------+----------------+ 
| Column | Type | Index |    | 
+--------+---------+-------------+----------------+ 
| RID | int  | primary_key | auto increment | 
| ID  | int  | index  |    | 
| Type | int  |    |    | 
| Order | int  |    |    | 
| Num | int  |    |    | 
| Val1 | decimal |    |    | 
| Val2 | decimal |    |    | 
+--------+---------+-------------+----------------+ 

每個樣品具有ID,不同類型的順序Val1Val2Num型分析的結果。現在有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。這就是我試圖使用連接的原因。

+0

你可以列出結構或者是數據吧...您在WHERE子句中引用的「S型」。此外,你正在尋找每個「ID」的基礎上的結果?,並且每個化學分析預計在一個特定的順序?如條件1必須在條件2之前找到,等條件3等?從滿足所有3個標準的那些是......那些是你想要的最終記錄? – DRapp

+0

@DRapp我在這裏寫了查詢,所以SType被誤寫了。這是「類型」。正如我所說的需要一個通過過濾器的ID的所有數據。作爲一個例子如果我的條件爲「類型1,數字5小於20 val2」,29.62,22,96仍然會顯示爲Val2。因爲有參數通過ID爲118的過濾器。 – tuze

回答

0

我已經解決了我的問題,查詢相同的Nums和類型在一起,而不是用單獨的連接讀取它們。通過這種方式,沒有其他相同的數字和類型的數據可以通過該過濾器。

對於條件

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

所以,在餐桌上,要求是

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 

這是需要加以評估基本上4個不同的指標分析(類型,NUM,VAL1,VAL2)

雖然有可能是 「更好」 的解決方案(就性能而言或易於閱讀的代碼而言),最簡單的方法是創建不同的條件對,除非您處理數百萬條記錄,否則應該沒問題。

出你的要求,我會derrive,你需要要獲取的下一行集:

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

所以,這將是「4明確的」查詢工會:

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 

,以濾除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