mysql - 基于条件多连接获取唯一记录

标签 mysql

我有 4 个表:postsusersmentionsfollowing

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/

相关文章:

php - Haversine 公式中的连接操作

mysql - 授予对选定表的权限

php - 使用 Docker 工具箱 MySQL 连接超时

mysql - 使用 mysql C 连接器连接到 memsql 时出错

php - 如何找到给定数组的可能子集?

mysql - 保留 mySQL 自动递增的 ID?

MySQL创建外键错误150

MySQL更新错误1093

mysql - 如何在存储过程中创建mysql嵌套循环

java - 内存中的陈旧对象(mysql、spring 3、hibernate)