如何在 MySQL 中加入 2 个以上的表?

Posted

技术标签:

【中文标题】如何在 MySQL 中加入 2 个以上的表?【英文标题】:How to join more than 2 tables in MySQL? 【发布时间】:2015-11-11 18:48:21 【问题描述】:

我有 3 张桌子,我想将所有桌子连接起来。但我的第三张桌子不工作。

看看我的桌子 -

用户

 id       | username       |is_active
----------|----------------|------------
 1        | chinu          | 1  
 2        | sradhanjali    | 1
 3        | User3          | 0

设置

 id       | user_id   |  public_msg_notification
----------|-----------|---------------------------
 1        | 1         | 1  
 2        | 2         | 1
 3        | 3         | 1

朋友

 id       | user_id   |  friend_id  |  is_block
----------|-----------|---------------------------
 1        | 3         | 1           |  0
 2        | 1         | 2           |  1
 3        | 3         | 2           |  0

查询

SELECT a.username FROM users a
  JOIN settings b
  JOIN friends c ON(a.id=c.user_id OR a.id=c.friend_id)
  WHERE a.username IN('john','piter','rahul','sradhanjali')
    AND a.id != '1' AND a.is_active=1
    AND a.id=b.user_id AND b.public_msg_notification=1
    AND c.is_block=0 GROUP BY a.username

我已经在我的本地运行了这个查询,只提取了sradhanjali 用户名。但是friends 表中的这个用户is_block=1

我认为我的第三张桌子 friends 不工作。我想向那些is_block=0 的用户展示这个结果。在上面的数据中,我的输出应该为零(0)但是在执行上面的查询时我得到了 1 条记录。

【问题讨论】:

您忘记了 ONJOIN settings b 部分 无需在settings表中添加ON @CodeGodie 根据您的评论,我在查询中添加了ON。未发现任何更改 为了给您正确的答案,让我们知道您的预期输出是什么? 你是对的,没有需要settings添加ON,但是你的a.id=b.user_idON完全一样,而且更好当你把它写成ON 【参考方案1】:

我们进行了一次聊天讨论,我认为这个问题大部分情况下都不应该出现在 SO 上。我确实承诺,如果我能弄清楚,我会尝试提供一些见解。在这一点上我认为这是一个正确的方法,但它非常具体到这个实例。

SELECT u.username FROM users u 
JOIN (SELECT 
    IF(u.id=f.user_id, f.friend_id, f.user_id) as ids
          FROM users u 
          JOIN friends f ON (f.user_id=u.id OR f.friend_id=u.id)
                WHERE
        u.id=$SOME_ID AND f.is_block=0) friends ON (u.id=friends.ids)
JOIN settings s ON (s.user_id=friends.ids)
WHERE  s.public_msg_notification=1 AND u.is_active=1
GROUP BY friends.ids

通过尝试过于具体,您将无法再打开查询,而必须在内部进行嵌套查询。这应该让所有与您成为朋友的用户 THEN 查看哪些用户正在接受公共通知并处于活动状态。我担心这会失败。但这至少会让你朝着正确的方向前进。

【讨论】:

我的输出应该是0,因为没有条件满足。 没有。根据您的条件,它是满意的。如果你想让它不满意,你必须删除ON中的OR,它不会满足任何人 @Chinu 您必须意识到,当您编写这些查询时,您必须逐步将其分解。查询中的 OR 允许双重情况,其中 1 和 2 是有效输出。如果您删除它,那么您将得到 0。此查询将根据您的表返回 1 和 2。 是的,但是这种情况下2 id 可能是user_id 列或settings 表中的friend_id 我不想失礼,但那句话没有意义。正如您所布置的那样,ID 2 仅与 a.id AND (c.user_id OR c.friend_id) 相关。

以上是关于如何在 MySQL 中加入 2 个以上的表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL/MariaDB 中加入两个巨大的表?

如何在mysql中加入2个视图? [复制]

如何在mysql中加入3个表

如何在 SQL 中加入包含祖父-父-子列的表?

如何在postgres中加入带有动态标识符的表?

在 MySQL 中加入“博客”表和“评论”表