我有一個表具有以下結構和實施例的數據:查詢具有2個COLS與多個條件表
現在我想查詢具有value
等於#
和@
記錄。根據上述圖像
例如,它應該返回1
和2
id
-----
1
2
此外,如果參數是@
,#
和$
它應該給我們1
。因爲只有ID爲1
的記錄具有所有給定的值。
id
-----
1
我有一個表具有以下結構和實施例的數據:查詢具有2個COLS與多個條件表
現在我想查詢具有value
等於#
和@
記錄。根據上述圖像
例如,它應該返回1
和2
id
-----
1
2
此外,如果參數是@
,#
和$
它應該給我們1
。因爲只有ID爲1
的記錄具有所有給定的值。
id
-----
1
您可以通過使用一個組,都要得到包含的項目數量的非重複計數您正在尋找
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你可以使用這個鏈接來測試不同編號的
也許多個自我加入是這樣的?
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
...
謝謝,但你的查詢有性能問題 – rejnev
沒有看到一個計劃很難說什麼。 但是你也可以用'exists'做類似的事情。而且一些索引通常也可以提供幫助。 –
有幾種方法可以做到這一點。
子查詢方法:
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供應商都支持所有方法。
我昨天回答了一個類似的問題,你可能會發現它有幫助:http://stackoverflow.com/questions/32959889/mysql-join-table-query-2-values – jpw