我有3个表我希望彼此加入所有表。但是我的第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
用户名中运行此查询。但是is_block=1
表中的此用户friends
。
我认为我的第三张桌子friends
无效。我希望将结果显示为is_block=0
的用户名。在上面的数据中,我的输出应该为零(0)但是在执行上面的查询时我得到1条记录。
答案 0 :(得分: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
通过尝试过于具体,您无法再打开查询,并且必须在内部执行嵌套查询。这应该让所有与您成为朋友的用户都知道哪些用户正在接受公共通知并且处于活动状态。我担心这会失败。但这至少会让你朝着正确的方向前进。