2015-10-06 206 views
3

我有一個表具有以下結構和實施例的數據:查詢具有2個COLS與多個條件表

enter image description here

現在我想查詢具有value等於#@記錄。根據上述圖像
例如,它應該返回12

id 
----- 
1 
2  

此外,如果參數是@#$它應該給我們1。因爲只有ID爲1的記錄具有所有給定的值。

id 
----- 
1 
+0

我昨天回答了一個類似的問題,你可能會發現它有幫助:http://stackoverflow.com/questions/32959889/mysql-join-table-query-2-values – jpw

回答

5

您可以通過使用一個組,都要得到包含的項目數量的非重複計數您正在尋找

SELECT Id 
FROM Table 
WHERE Value IN ('#','$') 
GROUP BY Id 
HAVING COUNT(DISTINCT Value) = 2 

SELECT Id 
FROM Table 
WHERE Value IN ('#','$','@') 
GROUP BY Id 
HAVING COUNT(DISTINCT Value) = 3 

SQL Fiddle你可以使用這個鏈接來測試不同編號的

+0

在某些情況下,它不起作用。例如,記錄1有2個'#'值,但我們的邏輯是具有所有值爲 – rejnev

+1

的記錄,這就是'HAVING COUNT(DISTINCT Value)= 2'爲您所做的所有值。它只會計數一次# – JamieD77

+1

The這種方式的好處在於,如果參數是可變的,它們可以放在一個表變量中並加入 - 類似的計數將會產生有效的結果。 – Hogan

1

也許多個自我加入是這樣的?

select 
    distinct t1.id 
from 
    table t1 
    join table t2 on (t1.id=t2.id) 
    join table t3 on (t1.id=t3.id) 
    ... 
where 
    t1.value='@' and 
    t2.value='#' and 
    t3.value='$' and 
    ... 
+0

謝謝,但你的查詢有性能問題 – rejnev

+0

沒有看到一個計劃很難說什麼。 但是你也可以用'exists'做類似的事情。而且一些索引通常也可以提供幫助。 –

2

有幾種方法可以做到這一點。

子查詢方法:

SELECT DISTINCT Id 
FROM Table 
WHERE Id IN (SELECT Id FROM Table WHERE Value = '@') 
    AND Id IN (SELECT Id FROM Table WHERE Value = '@'); 

的相關子方法:

SELECT DISTINCT t.Id 
FROM Table t 
WHERE EXISTS (SELECT 1 FROM Table a WHERE a.Id = t.Id and a.Value = '@') 
    AND EXISTS (SELECT 1 FROM Table b WHERE b.Id = t.Id and b.Value = '#'); 

和交叉方法:

SELECT Id FROM Table WHERE Value = '#' 
INTERSECT 
SELECT Id FROM Table WHERE Value = '@'; 

最佳性能將取決於RDBMS供應商,表的大小和索引。並非所有RDBMS供應商都支持所有方法。