最近アクティビティがあったアイテムを取得するための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
これは機能しますが、アイテムが誰かのウィッシュリストに追加され、レビューが投稿された場合、そのアイテムは2回返されます。UNION
通常は重複を削除しdate
ますが、2つの行が異なるため、両方の行が返されます。重複する行を削除するときに日付を無視するように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
しかし、それは何らかの理由でめちゃくちゃ遅いことが判明しました(約30分かかりました)。