我有 4 个表:posts
、users
、mentions
、following
posts
----------------------------
id | user_id | post_text
1 1 foo
2 1 bar
3 2 hello
4 3 jason
users
------------
id | name
1 jason
2 nicole
3 frank
mentions
--------------------------
id | post_id | user_id
1 4 1
following
-------------------------------------------------
id | user_id | user_id_of_user_being_followed
1 1 2
posts
包括发布一些文本的用户的 user_id
users
包含用户的用户 ID 和名称
mentions
包含提及 1 个或多个其他用户的任何帖子的帖子 ID 和用户 ID
following
有一个用户 ID 和他们正在关注的用户(用户可以关注 0 到许多用户)
我想做的是返回给定用户关注的用户 a 的所有帖子,以及提及该用户的所有帖子(无论给定用户是否关注),而不返回任何重复内容。
SELECT p.id, p.post, u.name,
FROM following f
JOIN posts p ON f.following = p.user_id
JOIN users u ON u.id = p.user_id
WHERE f.user_id = :user;
上面返回了给定用户正在关注的用户的所有帖子,但我正在努力弄清楚如何也包括提及(请记住,用户不必关注某人就可以看到他们的帖子'已经提到过)。
更新: 感谢 John R 我能够弄清楚这一点:
SELECT DISTINCT(p.id), p.post, u.name
FROM posts p
LEFT JOIN following f ON f.following = p.user_id
LEFT JOIN mentions m ON m.posts_id = p.id
JOIN users u ON u.id = p.user_id
WHERE (f.user_id = :user_id OR m.user_id = :user_id)
最佳答案
如果我正确理解你的问题,你会想要一个左连接来包含任何提及..但不过滤掉任何关注者/帖子
如果你可以添加一些样本数据来玩,我可以确保它按照你想要的方式工作......
SELECT
if(p.id is not null, p.id, p1.id) as post_id,
if(p.post is not null, p.post, p1.post) as post_text,
u.username, m.id, m.user_id
FROM posts p
JOIN users u on u.id = p.user_id
JOIN following f on f.user_id_of_user_being_followed = u.id
LEFT JOIN mentions m on m.user_id = f.user_id
LEFT JOIN posts p1 on p1.id = m.post_id
WHERE f.user_id = :user or m.user_id = :user;
我将 join mentions 留在了帖子中,并且当 mention 表中的 user_id 等于指定用户时,以过滤掉其他用户。左连接不应该改变返回的行数..但只包括任何提及
编辑: WORKING FIDDLE
在玩弄它之后,我意识到它试图将所有数据放在一行中。试试这个:
(
SELECT p.id, p.post_text, u.name
FROM posts p
JOIN users u on u.id = p.user_id
JOIN following f on f.user_id_of_user_being_followed = u.id
WHERE f.user_id = 1
)
UNION
(
SELECT p.id, p.post_text, u.name
FROM following f
JOIN mentions m on m.user_id = f.user_id
JOIN posts p on p.id = m.post_id
join users u on u.id = p.user_id
WHERE f.user_id = 1
);
关于mysql - 基于条件多连接获取唯一记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24457960/