2013-08-17 74 views
0

我有喜欢的表/不喜欢的游戏:身份证,game_id,类型(喜欢/不喜欢),时间我应该如何在SQL中运行此查询?

表例如:图片链接

此代码给我的最后一个星期的游戏有喜欢,为了通过他们的喜欢计数:

$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将是第二个。

非常感谢!

回答

0

为周添加一列,然后按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} 
+0

你能解释一下你在这里做了什么吗?我不知道什么是datepart,什么是order by – user2670497

+0

datepart从任何日期取出周/年/日。按2排序是按第二栏排序的结果。你可以尝试这个简单的选择 像'选择日期部分(wk,getdate())'周''选择日期部分(yy,getdate())' – Nilesh

+0

这不是工作伙计。 – user2670497

0

您需要使用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的,据我所知它同时支持区间运算和计算的订单。

+0

这不起作用.. – user2670497

+1

好吧,我明白了。您的查询已基于$ time返回最后一周的计数。你想要什么,所有喜欢的数量,但排序最后几周喜欢?然后只需从WHERE条件中删除AND'time'>'{$ time}'。 – dnoeth