mysql - 如何使用mysql join on or condition?

标签 mysql sql node.js database

我已经尝试构建此查询,它只从 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/

相关文章:

mysql - base64 编码 HTML 编辑器文本以存储在数据库中

php - 第 6 行的可捕获 fatal error : Object of class mysqli could not be converted to string in/home/cabox/workspace/writing/login. php

mysql - 客户/公司地址/电话号码

SQL 查询 - 当我们在 where 子句中使用主键时更新/删除语句的性能

node.js - 由于 imagemin 问题,Grunt 构建失败,出了什么问题?

node.js - NodeJs + Postgres 同步连接到数据库以填充变量

php - 在 mySQL 中自动创建包含填充数据的表或行

mysql - 如果有相同的列值,则只选择具有最高 id 值的行

mysql - 在表中查找过去几周没有事件的记录

node.js - Docker容器中的Node.js应用尝试连接到其他Docker容器中的mongodb时出错