我有这样的安排:
我想检索关注者共享的所有帖子,请记住那些共享的帖子不属于另一个关注者或主要关注者。
表格用户
id_user | name
15 Joe
16 Dan
17 Tom
表社区
id_follower | followed
15 16
15 17
表格帖子
id_post | id_user | post
1 15 hi1
2 16 hi2
3 15 hi3
4 17 hi4
5 15 hi5
6 16 hi6
7 17 hi7
8 18 hi8
9 14 hi9
我要添加一个新表“ shares”。
表格共享
id_sharer | id_post
16 4
14 8
17 8
16 9
期望的输出帖子
17 8 hi7 (shared by Tom)
16 9 hi6 (shared by Dan)
sql查询应该如何获得这种新的安排?
我正在考虑添加一行LEFT JOIN shares l ON l.id_sharer=p.id_user
SELECT p.*,
FROM posts p
LEFT JOIN users u ON u.id_user=c.id_followed
LEFT JOIN shares l ON l.id_sharer=c.id_followed
LEFT JOIN community c ON c.id_follower=p.id_user
WHERE p.id_user=15
ORDER BY p.date_post DESC
*已测试,但未按预期检索
答案 0 :(得分:1)
这是您的第一个难题:
SELECT p.id_post, p.id_user, p.post, IF(l.date_like IS NOT NULL, l.date_like, p.date_post) AS date, l.id_liker
FROM posts p
LEFT JOIN likes l ON l.id_post = p.id_post
LEFT JOIN users u ON u.id_user = l.id_liker
ORDER BY l.date_like DESC
GROUP BY p.id_post
作为快速了解我如何解决问题的方式,首先,我像您一样,先将喜欢的对象加入并按降序排列。然后,我对帖子ID进行分组,以确保每个帖子仅获得一行。然后在选择器中,我要检查喜欢的日期是否为空,并替换帖子的日期,而不是没有喜欢的最新日期。
更新
这应该添加逻辑以确保只有关注者的人数才能计数。由于一个人可能无法跟随自己,因此这也应该使自己的喜好不会影响位置。
SELECT p.id_post, p.id_user, p.post, IF(l.date_like IS NOT NULL, l.date_like, p.date_post) AS date, l.id_liker
FROM posts p
LEFT JOIN likes l ON l.id_post = p.id_post
LEFT JOIN users u ON u.id_user = l.id_liker
LEFT JOIN community c ON l.id_liker = c.followed
WHERE c.id_follower = 15
ORDER BY l.date_like DESC, p.date_post DESC
GROUP BY p.id_post
答案 1 :(得分:0)
我知道'TABLE POSTS'.'id_user'
是帖子的作者,并且与'TABLE USERS'.'id_user'
相匹配,并且您希望先查看'TABLE LIKES'
中具有条目的帖子,然后再查看所有其他条目。< br />
因此,我建议以下JOIN
和ORDER BY
select p.*, l.date_like, u.* from posts p
left join likes l on p.id_post=l.id_post
left join users u on l.id_liker=u.id_user
order by l.date_like desc, p.date_post desc