我已经尝试构建此查询,它只从 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
我正在使用 nodejs 和 mysql。
更新: 好的,让我添加一些可能会澄清的解释。我想要 USER 表中 USER 的所有设置信息,对于不在关注者中的两个用户 ID 以及用户表中与关注者 ref id 的值匹配的任何关注者 --- 所以最终我想要回用户 A,用户 B 和用户 c、d、e、f(如果它们与 ref 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 = a OR USERS.uid = b
替换为 USERS.uid IN (a, b)
不仅更易于编码和阅读,而且通常性能要好得多(取决于优化器的好坏),因为通常只有一个索引
被选中并且只有一个表达式用于获取值以在该索引中查找,因此您将快速找到 a
,但 b
将进行完整扫描,反之亦然).
关于mysql - 如何使用mysql join on or condition?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57565145/