#php #mysql #sql-order-by
Вопрос:
У меня простая проблема, 2 таблицы mysql, в одной хранятся фотографии, а другой нравятся. Структура такая:
table `photos` - id, name, image_id
table `likes` - id_photos, timestamp
Теперь это тривиально-заказать фотографии по их лайкам и получить ТОП-3, как это:
SELECT photos.*
, COUNT(likes.id) AS likes_count
FROM photos
LEFT JOIN likes ON photos.id = likes.id_photos
GROUP BY photos.id
ORDER BY likes_count DESC LIMIT 3;
Но то, что я хочу добавить, — это относительность времени, означающая, что новые лайки имеют больший «вес», и хотя некоторые фотографии могут иметь больше лайков, они старше и заказываются ниже, чем фотографии с меньшим количеством лайков, но более новые.
Возможно ли решить эту проблему только в MySQL ? Или с дополнительной обработкой в PHP ?
Комментарии:
1. Есть идеи, какую функцию взвешивания вы бы хотели? Например, у вас могла бы быть кривая спада, такая, что стоимость like уменьшается вдвое каждый день? Или то, что подобное произошло в два раза раньше, чем другое, стоит вдвое меньше? Но у всех них есть свои особенности, как хорошие, так и плохие. Вам нужно выбрать алгоритм, затем мы сможем объяснить, как его реализовать в SQL.
2. Вы имеете в виду, что вам нужен некоторый вес для новых лайков в соответствии с датами, которые они добавили. вам нужно выбрать какой-то алгоритм
3. @MatBailie Первый пример, который вы упомянули, был бы прекрасным. Могу ли я попросить вас ответить на это решение, пожалуйста ?
Ответ №1:
Давайте рассмотрим случай тогда likes
. timestamp
является полем UNIXTIME, поэтому, если мы вместо этого используем SUM(метку времени), подсчет новых озер будет иметь больший вес :
SELECT photos.*
, COUNT(likes.id) AS likes_count
, SUM(likes.timestamp) AS likes_weight
FROM photos
LEFT JOIN likes ON photos.id = likes.id_photos
GROUP BY photos.id
ORDER BY likes_weight DESC LIMIT 3;
Возможно использовать некоторый коэффициент (например, UNIX_TIMESTAMP())
SELECT photos.*
, COUNT(likes.id) AS likes_count
, SUM(likes.timestamp)/UNIX_TIMESTAMP() AS likes_weight
FROM photos
LEFT JOIN likes ON photos.id = likes.id_photos
GROUP BY photos.id
ORDER BY likes_weight DESC LIMIT 3;