【问题标题】:How should I run this query in SQL?我应该如何在 SQL 中运行这个查询?
【发布时间】:2013-08-17 14:27:07
【问题描述】:

我有喜欢/不喜欢游戏的表格:id、game_id、类型(喜欢/不喜欢)、时间

表格示例:图片链接

这个代码给了我上周喜欢的游戏,按他们的喜欢计数排序:

$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 将成为第二。

非常感谢!

【问题讨论】:

    标签: php sql sql-order-by


    【解决方案1】:

    为一周添加一列,并按该列按降序排列。

    类似的东西

    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}
    

    【讨论】:

    • 你能解释一下你在这里做了什么吗?我不知道什么是 datepart,什么是 order by 2
    • Datepart 从任何日期取出周/年/日。按 2 排序是按第二列排序结果。您可以在简单的选择中尝试此操作,例如一周 Select DatePart(wk, getdate()) 一年 Select Datepart(yy,getdate())
    • 你得到了什么结果?你能发布预期和实际结果吗?
    【解决方案2】:

    你需要使用一个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}
    

    您的 DBMS 似乎是 MySQL,它支持 INTERVAL 算术和 ORDER 计算。

    【讨论】:

    • 好的,我明白了。您的查询已根据 $time 返回上周的计数。你想要什么,所有喜欢但排序为上周喜欢的计数?然后只需从 WHERE 条件中删除 AND time > '{$time}'。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多