2014-01-29 95 views
0

我有兩個表user(id, name)user_detail(id, user_id, type, value),顯然它們之間的關係是1:n。如何僅檢索具有其他記錄列表的記錄

user_detail包含記錄,例如:

(1, 1, 'HAIR', 'BROWN'); 
(2, 1, 'HAIR', 'BLONDE'); 
... 
(321, 2, 'EYES', 'GREEN'); 

現在,我的問題是要有效地檢索,所有用戶都具有一定的細節,如HAIR=BLONDE & EYES=GREEN & HEIGHT>140

處理像這樣的實體/關係的最佳解決方案是什麼?

回答

2

靈活方法是使用group by和聚集:

select ud.user_id 
from user_detail ud 
group by ud.user_id 
having sum(type = 'hair' and value = 'blonde') > 0 and 
     sum(type = 'eyes' and value = 'green') > 0; 
1
SELECT user.id AS user_id, user.name, 
     user_detail.id as user_detail_id, user_detail.user_id AS user_detail_user_id, user_detail.type, user_detail.value 
    FROM user 
     INNER JOIN user_detail 
       ON user.user_id = user_detail.user_detail_user_id 
ORDER BY user.name 

這將爲每個存在的條目返回一行,並且可以在每個表中連接在一起。因此,如果單個用戶具有「頭髮」和「眼睛」條目,則該用戶將具有列出的兩行。如果user表中存在用戶,但在user_detail表中沒有值,則不會列出它們。如果您希望即使沒有數值也會列出它們,請將INNER JOIN更改爲LEFT JOIN

請注意,與上面的AS一起使用的列別名完全是任意的。您可以在您的應用程序中使用您想要的列名。

相關問題