[英]SQL query from 3 different tables
有3個表:
Users table
------------
|uid|username|
------------
Values table
------------------
|vid|values|checked|
------------------
Relations
-----------
|cid|uid|vid|
-----------
關系表包含與值ID相關的用戶ID。 如何從值表中選擇與關聯表中給定用戶ID不相關的值ID?
編輯:
到目前為止我嘗試過的是:
SELECT vid FROM relations where uid=user_id //this gives me array of value ids
SELECT vid FROM values where vid!=vid1 AND vid!=vid2 .....
EDIT2:基本解決方案可以在這里找到。 但是,有沒有更有效的方法? 如果值表和關系表的表都很大,則基本解決方案效率不高。
您正在使用哪個dbms? 它支持減號條款嗎? 如果是的話,你可以做這樣的事情
select vid from values
minus
select vid from relations where uid = @user_id
這應該給出未映射到給定用戶ID的vid
另一種方法是通過不存在子句(如果您的dbms不支持減號子句,則很方便)
select v.vid from values v where not exists (select 1 from relations r where
r.vid = v.vid and r.user_id = @user_id)
我會警告不要使用not in子句。 它的性能令人懷疑,並且如果內部查詢返回空值,則失敗,盡管這在您的情況下是不可能的,但是您應該養成一種習慣,永遠不要對子查詢使用“ not in”子句。 僅當具有文字值列表時使用它,例如“ ... vid not in(1、2、3、4)”。 每當您必須根據另一個表中的值從一個表中“減去”某物時,請使用“不存在”並且永遠不要“不存在”
你可以嗎?
select vid from values where vid not in (select vid from relations where uid = user_id)
我認為類似此查詢的簡單操作就足夠了。
如果值表中沒有特定條目的uid,則關系表中也不應存在任何條目。
SELECT vid
FROM values
LEFT JOIN relations on values.vid = relations.vid
WHERE relations.uid IS NULL
select distinct v.vid
from values v
left join relations r on (r.vid=v.vid)
where r.uid != user_id
這是不幸的是,MySQL不支持with
; 不幸的是,這將不能很好地執行。
如果“關系”表中的值恰好是0或1倍,則可以為此使用JOIN
:
SELECT `Values`.`vid` FROM `Values`
LEFT JOIN `Relations` ON (`Values`.`vid` = `Relations`.`vid`)
WHERE `Relations`.`uid` != 1;
如果“關系”表中的“值”大於1次,則此方法將不起作用,因為在這種情況下, WHERE
將匹配具有不同uid的另一行。 與NOT IN
相同,這也可以將具有相同vid的另一個行與另一個uid匹配。
如果每個值在Relations表中至少一次,那么最有效的方法是僅查詢Relations表:
SELECT DISTINCT `Relations`.`vid` FROM `Relations`
WHERE `Relations`.`uid` != 1;
如果在“關系”表中“值”可以為0、1或多次,則最好的方法是使用EXISTS
(另請參見taimur的答案):
SELECT `Values`.`vid` FROM `Values`
WHERE NOT EXISTS (
SELECT * FROM `Relations`
WHERE `Relations`.`vid` = `Values`.`vid` AND `Relations`.`uid` = 1
);
但是, EXISTS
比IN
或JOIN
慢一點,因此您應該比較您的情況下執行時間。
我認為您可以執行這樣的簡單查詢(假設用戶標識符的數據類型為int
):
DECLARE @givenUserID int --local variable where you store the given user identifier
SELECT vid
FROM Values
WHERE vid NOT IN (SELECT vid FROM Relations where uid = @givenUserID)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.