Как запустить этот запрос в SQL?

109
13

У меня есть таблица симпатий/антипатий к игре: id, game_id, type (like/dislike), время

Пример таблицы: Image Link

Этот код дает мне последние игры на прошлой неделе, которые им нравятся, порядок по их мнению:

$limit = 10;
$time = _time() - 60*60*24*7;
$games_id = array();
$games_id_query = $this->db->execQuery("SELECT 'game_id', count(*) as 'likes_count' FROM 'likes' WHERE 'type' = 'like' AND 'time' > '{$time}' group by 'game_id' order by 'likes_count' DESC LIMIT {$limit}");
$games_id_num = $games_id_query->num_rows;
if($games_id_num > 0) {
while($row = $games_id_query->fetch_object()) {
unset($row->likes_count);
$games_id[] = (array) $row;
}
}

Я хочу сделать этот запрос, чтобы быть заказ ТОЛЬКО понравившихся, которые попадают на прошлую неделю.

Пример: если игра X имеет 5, и игра Y имеет 6 понравлений, но игра X получает ЭТУ НЕДЕЛЮ 3 нравится, а игра Y получает ЭТУ НЕДЕЛЕ 2 - игра X будет первой, а игра Y будет второй.

Большое вам спасибо !

спросил(а) 2021-01-25T21:36:40+03:00 4 месяца, 4 недели назад
1
Решение
88

Вам нужно использовать CASE:

SELECT 'game_id', COUNT(*) AS 'likes_count' 
FROM 'likes'
WHERE 'TYPE' = 'like' AND 'TIME' > '{$time}'
GROUP BY 'game_id'
ORDER BY COUNT(CASE WHEN 'TIME' >= CURRENT_TIMESTAMP - INTERVAL '7' DAY END) DESC
LIMIT {$limit}

Ваша СУБД, похоже, является MySQL, afaik поддерживает как арифметику INTERVAL, так и расчеты в ORDER.

ответил(а) 2021-01-25T21:36:40+03:00 4 месяца, 4 недели назад
46

Добавьте столбец на неделю и закажите его по этому столбцу в порядке desc.

Что-то вроде этого


SELECT game_id
,DATEPART(wk, likeDate)
,count(*) as 'likes_count'
FROM likes
WHERE typ = 'like'
AND time > '{$time}'
group by
game_id
,DATEPART(wk, likeDate)
order by
2 DESC
LIMIT {$limit}

ответил(а) 2021-01-25T21:36:40+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема