Как заказать таблицу в mysql по лайкам относительно их времени?

#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;