我有兩個表:如何針對表連接上的多個條件進行匹配?
users attributes
id|name id|name|user_id
------- ---------------
1 |foo 1 |bla | 1
2 |bar 1 |blub| 1
1 |bla | 2
如何創建一個查詢,使用戶無論是「喇嘛」和「咕嚕咕嚕」的屬性?
在這種情況下,它應該只返回用戶「foo」。
我知道數據沒有正常化。
我有兩個表:如何針對表連接上的多個條件進行匹配?
users attributes
id|name id|name|user_id
------- ---------------
1 |foo 1 |bla | 1
2 |bar 1 |blub| 1
1 |bla | 2
如何創建一個查詢,使用戶無論是「喇嘛」和「咕嚕咕嚕」的屬性?
在這種情況下,它應該只返回用戶「foo」。
我知道數據沒有正常化。
SELECT u.*, a.id, b.Id, a.name, b.name FROM users u
JOIN attributes a
ON a.User_id = u.User_id AND a.name = 'bla'
JOIN attributes b
ON u.User_Id = b.User_id AND b.name = 'blub'
我覺得'u.name'應該是'a.name'和'b.name'。 – 2013-05-13 17:06:46
@LinusCaldwell:你完全正確,修正。 – Jeff 2013-05-13 17:07:52
我會把這個值包裹起來,例如:''bla''。但是,正確答案爲+1。 – 2013-05-13 17:08:41
假設一個屬性關聯到用戶是唯一的......
,如果你需要3個條件是真實的條件添加到在調整計數1
SELECT u.name
FROM users u
INNER JOIN attributes a on A.user_Id = u.id
WHERE a.name in ('bla','blub')
GROUP by u.name
HAVING count(*)=2
如果你沒有一個獨特的關聯,或者你需要加入到另一張桌子,你可以隨時做...
SELECT u.name
FROM users u
INNER JOIN attributes a on A.user_Id = u.id
WHERE a.name in ('bla','blub')
GROUP by u.name
HAVING count(distinct A.name)=2
輕微的表現打擊。但是這可以讓你加入並獲得其他領域,其他人已經表明這是對這種方法的損害。
這允許縮放解決方案,而不是承擔每次加入不同表的費用。另外,如果您需要三十個值進行關聯,您可能會遇到允許的連接數限制。
SELECT U.NAME
FROM USERS U
INNER JOIN
ATTRIBUTES A1
ON U.ID = A1.USER_ID
INNER JOIN
ATTRIBUTES A2
ON U.ID = A2.USER_ID
WHERE A1.NAME = 'bla'
AND A2.NAME = 'blub'
可以使用INTERSECT操作
SELECT
u.id
,u.name
FROM users AS u
INNER JOIN attributes AS a
ON u.id = a.user_id
WHERE a.name = 'bla'
INTERSECT
SELECT
u.id
,u.name
FROM users AS u
INNER JOIN attributes AS a
ON u.id = a.user_id
WHERE a.name = 'blub'
;
這裏是SQL小提琴演示:http://sqlfiddle.com/#!6/68986/5
更多在SQL中設置操作信息:http://en.wikipedia.org/wiki/Set_operations_(SQL)
我沒有使用INTERSECT(或任何SET操作),但它看起來好像它的工作。任何熟悉套件的人都可以閱讀。性能與多重連接方法相比如何? – Jeff 2013-05-13 17:23:28
這取決於很多不同的因素。這裏是一篇關於性能的博客文章:http://sqlserverpedia.com/blog/sql-server-bloggers/t-sql-set-operators-intersect-except-and-union/ 我會建議比較執行計劃。 – 2013-05-13 17:43:41
我做的編輯到你的問題和標題,希望它會更清晰。如果您覺得我沒有改善您的問題,請隨時恢復。 – Jeff 2013-05-13 17:21:19