2010-03-06 62 views
2

我有此架構,我需要從的MySQL - 匹配2行(或更多)的子查詢/表內

的user_data匹配2行:USER_ID,FIELD_ID,值

樣品輸出將是:

user_id  field_id value 
----------------------------- 
    1   1   Gandalf 
    1   2   Glamdring 

如何編寫一個查詢,基本上說「查找用戶的用戶ID,其FIELD_ID 1甘道夫和FIELD_ID 2是敵擊劍?」

SELECT FROM一次只查看一行。我困惑於此。我還需要找到一個優雅的規模(如看三排等)的解決方案

回答

3

您可以運行查詢來獲取匹配每個條件並與結果相交的用戶。由於MySQL不支持相交,因此可以使用n-way連接進行:

SELECT T1.user_id 
FROM Table1 T1 
JOIN Table1 T2 ON T1.user_id = T2.user_id 
WHERE T1.field_id = 1 AND T1.value = 'Gandalf' 
AND T2.field_id = 2 AND T2.value = 'Glamdring' 
1

我會嘗試以下方法:

SELECT user_id 
FROM user_data 
WHERE (field_id = 1 AND value= 'Gandalf') 
    OR (field_id = 3 AND value = 'Glamdring') 
GROUP BY user_id 
HAVING COUNT(field_id) = 2 

它將搜索匹配之一的所有行的標準,然後使用GROUP BYHAVING查找具有預期匹配計數的user_id

+0

這個解決方案有一定的優雅,但人們可以爭辯說它不是100%準確的。我在優雅和正確之間被撕裂! – Extrakun 2010-03-06 09:23:55

+0

我再次編輯計算'field_id'而不是值,所以我認爲它現在是正確的(假設'field_id'在'user_id'內是唯一的)。 – 2010-03-06 09:25:20

0
select * from user_date where (field_id= 1 AND value='Gandalf') OR (field_id =2 AND value ='Glamdring') ; 
+0

...這似乎是一個OR(只要一場比賽,儘管其他的,它會工作) – Extrakun 2010-03-06 09:20:44

0

HAVING子句是關鍵。它將查詢從「OR」語句變爲「AND」語句