如何在 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 条记录。
【问题讨论】:
您忘记了ON
的 JOIN settings b
部分
无需在settings
表中添加ON
@CodeGodie 根据您的评论,我在查询中添加了ON
。未发现任何更改
为了给您正确的答案,让我们知道您的预期输出是什么?
你是对的,没有需要为settings
添加ON
,但是你的a.id=b.user_id
和ON
完全一样,而且更好当你把它写成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 个以上的表?的主要内容,如果未能解决你的问题,请参考以下文章