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)
但由于某种原因(大约需要半分钟),结果显得非常缓慢.
我根据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)
虽然我意识到这可能没有考虑到每个项目的哪个日期最高......不确定是否重要,如果是,那该怎么办呢.