[英]How to use mysql join on or condition?
我試圖構造此查詢,該查詢是僅從USER表中選擇記錄(如果它們出現在FOLLOWER表中),但會不斷出現val.slide錯誤。
這是我的查詢,如果我做錯了什么或如何更好地構造它,請告訴我:
SELECT * from USERS JOIN FOLLOWERS
ON (USERS.uid = FOLLOWERS.fid OR USERS.uid = a OR USERS.uid = b)
WHERE FOLLOWERS.refid = 1
我也嘗試過這個:
SELECT * from USERS WHERE (USERS.uid = a OR USERS.uid = b) JOIN FOLLOWERS
ON USERS.uid = FOLLOWERS.fid
WHERE FOLLOWERS.refid = 1
我正在使用帶有MySQL的nodejs。
更新:好的,讓我添加一些可能會清除它的解釋。 我想從USER表中獲取USER的所有設置信息,以獲取不在關注者中的兩個用戶ID,以及該用戶表中與關注者ref ID的值匹配的任何關注者-所以最終我想要返回用戶A,用戶B和用戶c,d,e,f(如果它們與參考ID匹配)。
Table USERS:
uid: a, settings_on: true
uid: b, settings_on: false
uid: c, settings_on: true
uid: d, settings_on: false
uid: e, settings_on: false
uid: f, settings_on: false
Table FOLLOWERS:
fid: c, ref_id: 1
fid: d, ref_id: 1
fid: e, ref_id: 3
fid: f, ref_id: 2
Expected:
uid: a, settings_on: true
uid: b, settings_on: false
uid: c, settings_on: true
uid: d, settings_on: false
這是預期的結果:
由於需要OR
條件,因此需要外部聯接,因此,跟隨者條件必須處於聯接條件中(否則您將有效地獲得內部聯接):
SELECT *
from USERS
LEFT JOIN FOLLOWERS ON USERS.uid = FOLLOWERS.fid
AND FOLLOWERS.refid = 1
WHERE USERS.uid IN (a, b) -- either the user id matches
OR FOLLOWERS.fid IS NOT NULL -- or the follower condition matches
用USERS.uid IN (a, b)
替換USERS.uid = a OR USERS.uid = b
不僅更容易編碼和讀取,而且通常表現得更好(取決於優化器的性能),因為通常只有一個索引被選中,並且僅使用一個表達式來獲取要在該索引中查找的值,因此您會很快找到a
,但是b
會進行全面掃描,反之亦然)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.