У меня есть запрос 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
Это работает, но когда элемент был помещен как в чей-то список желаний , так и отзыв был опубликован, элемент возвращается дважды. 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
Но это почему-то оказалось безумно медленным (заняло около полминуты).