我有两个表,我已将它们连接在一起,如下所示,以显示按降序添加的 id 的垫,效果很好。
SELECT p.* FROM ruj_users_pad
AS p LEFT JOIN ruj_users
AS u ON p.user_id = u.id
WHERE u.status !=0
AND 1
AND p.status = 1
GROUP BY p.added_date
DESC LIMIT 0, 20
但是,现在我想检索第三个表,该表也作为“added_date”列将其与先前的查询结合起来以显示新的降序。第三个表中的数据是在用户单击以收藏 pad 上的当前项目时通过按钮生成的。
这是我拥有的,但它不起作用。
SELECT p.*,f.added_date FROM ruj_users_pad
AS p LEFT JOIN ruj_users
AS u ON b.user_id=u.id
LEFT JOIN ruj_users_fave
AS f ON f.brag_id = u.id
WHERE u.status !=0
AND 1
AND p.status = 1
GROUP BY f.added_date DESC, b.added_date DESC
LIMIT 0, 20
结果返回与第一个结果相同。我不明白可能出了什么问题。我希望结果考虑到 ruj_users_fave 中有一个条目,并将其与第一个结果结合起来,将最喜欢的垫放在顶部。
非常感谢您的帮助。
最佳答案
这是使用 UNION
合并两个子查询来解决您的问题的方法。它不是三张表的完整查询,而是仅以两张表来展示概念的本质。我使用一个表 pad
和一个表 likes
。第一个子查询使用 MAX
和 GROUP BY id
选择 pad 的 id
及其最近的“like”。请注意,我将列 MAX(liked)
重命名为 timestamp
。
SELECT pad.id, MAX(liked) AS timestamp FROM
pad INNER JOIN likes WHERE likes.pad_id = pad.id
GROUP BY pad.id
另一个子查询选择尚未被点赞的 pad id
,即在 likes 表中不存在该特定 pad id
的记录。在这种情况下,您提到应该使用 pad 的创建日期来确定返回记录的顺序。因此,我们将 added
重命名为 timestamp
。
SELECT id, added AS timestamp FROM pad
WHERE NOT EXISTS
(SELECT liked FROM likes WHERE likes.pad_id = pad.id)
我们现在有两个子查询,它们返回 pad 的 id
和 timestamp
,因此我们可以使用 UNION
将它们组合成一个结果集,然后 ORDER
它 BY timestamp
。您的组合查询如下所示。
SELECT combined.id, combined.timestamp FROM
(
SELECT pad.id, MAX(liked) AS timestamp FROM
pad INNER JOIN likes WHERE likes.pad_id = pad.id
GROUP BY pad.id
UNION
SELECT id, added AS timestamp FROM pad
WHERE NOT EXISTS
(SELECT liked FROM likes WHERE likes.pad_id = pad.id)
)
combined ORDER BY combined.timestamp DESC;
关于mysql - 需要mysql查询结果的指导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14189546/