簡體   English   中英

來自3個不同表的SQL查詢

[英]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
);

但是, EXISTSINJOIN慢一點,因此您應該比較您的情況下執行時間。

我認為您可以執行這樣的簡單查詢(假設用戶標識符的數據類型為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM