我需要构建一个活动Feed,以便在每个用户个人资料页面上显示他们在网站上所做的事情。
有三个表:评论,评分,用户
我希望Feed包含用户发布的评论和评分。
在评论和评级表中,它存储发布它的用户的用户ID,而不是用户名,因此对于新闻Feed中的每个项目,它需要从用户表中选择用户ID相同的用户表。检索用户名。
Feed中的所有条目都应按日期排序。
即使我知道这是不正确的,这也是我得到的,因为它试图将两者都与users表中的同一行匹配。
SELECT comments.date, comments.url AS comment_url, comments.user_id, ratings.date, ratings.url AS rating_url, ratings.user_id, users.id, users.username
FROM comments, ratings, users
WHERE comments.user_id=%s
AND comments.user_id=users.id
AND ratings.user_id=%s
AND ratings.user_id=users.id
ORDER BY ratings.date, comments.date DESC
答案 0 :(得分:3)
JOIN。看来你知道,但这是如何: SELECT * FROM comments LEFT JOIN用户ON comments.user_id = users.id
因此,据我所知,你试图同时订购两件不同的东西。我认为最接近的是:
(SELECT comments.date AS date, users.username AS name, comments.url AS url CONCAT('Something happened: ',comments.url) AS text
FROM comments LEFT JOIN users ON comments.user_id = users.id
WHERE users.id = %s)
UNION
(SELECT ratings.date AS date, users.username AS name, ratings.url AS url CONCAT('Something happened: ',ratings.url) AS text
FROM comments LEFT JOIN users ON comments.user_id = users.id
WHERE users.id = %s)
ORDER BY date DESC LIMIT 0,10
请注意,union的两个部分的列都匹配。我很确定这样做是必要的。这就是为什么我有这个CONCAT语句,它允许你构建一个在评级和评论之间不同的字符串。