使用UNION时,在MySQL查询中删除重复结果

Ais*_*ina 2 mysql union duplicate-removal

我有一个MySQL查询来获取最近有活动的项目.基本上,用户可以发布评论或将其添加到他们的心愿单,我希望获得在过去x天内有新评论或被放在某人愿望清单上的所有项目.

查询有点像这样(略微简化):

SELECT items.*, reaction.timestamp AS date FROM items
LEFT JOIN reactions ON reactions.item_id = items.id
WHERE reactions.timestamp > 1251806994
GROUP BY items.id

UNION

SELECT items.*, wishlists.timestamp AS date FROM items
LEFT JOIN wishlist ON wishlists.item_id = items.id
WHERE wishlists.timestamp > 1251806994
GROUP BY items.id

ORDER BY date DESC LIMIT 5
Run Code Online (Sandbox Code Playgroud)

这样可行,但是当某个项目已放在某人的心愿单上并且发布了评论时,该项目将被返回两次.UNION通常删除重复项,但由于date两行之间不同,因此返回两行.我可以以某种方式告诉MySQL在删除重复行时忽略日期吗?

我也尝试过这样的事情:

SELECT items.*, IF(wishlists.id IS NOT NULL, wishlists.timestamp, reactions.timestamp) AS date FROM items
LEFT JOIN reactions ON reactions.item_id = items.id
LEFT JOIN wishlist ON wishlists.item_id = items.id

WHERE (wishlists.id IS NOT NULL AND wishlists.timestamp > 1251806994) OR
(reactions.id IS NOT NULL AND reactions.timestamp > 1251806994)
GROUP BY items.id

ORDER BY date DESC LIMIT 5
Run Code Online (Sandbox Code Playgroud)

但由于某种原因(大约需要半分钟),结果显得非常缓慢.

Ais*_*ina 5

我根据larryb82的想法自己解决了这个问题.我基本上做了以下事情:

SELECT * FROM (
    SELECT items.*, reaction.timestamp AS date FROM items
    LEFT JOIN reactions ON reactions.item_id = items.id
    WHERE reactions.timestamp > 1251806994
    GROUP BY items.id

    UNION

    SELECT items.*, wishlists.timestamp AS date FROM items
    LEFT JOIN wishlist ON wishlists.item_id = items.id
    WHERE wishlists.timestamp > 1251806994
    GROUP BY items.id

    ORDER BY date DESC LIMIT 5
) AS items

GROUP BY items.id
ORDER BY date DESC LIMIT 5
Run Code Online (Sandbox Code Playgroud)

虽然我意识到这可能没有考虑到每个项目的哪个日期最高......不确定是否重要,如果是,那该怎么办呢.