【问题标题】:How to use mysql join on or condition?如何使用mysql join on or condition?
【发布时间】:2019-12-25 04:04:07
【问题描述】:

我试图构造这个查询,它只从 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

这是预期的结果:

【问题讨论】:

  • 请提供样本数据和期望的结果。
  • 请看更新
  • 结果中的 d 怎么样?
  • 基于 ref_id
  • 那为什么不e呢?

标签: mysql sql node.js database


【解决方案1】:

因为你想要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 将进行全面扫描,反之亦然)。

【讨论】:

  • 这似乎不起作用,并且不确定所有这些是否有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 1970-01-01
相关资源
最近更新 更多