2013-08-17 73 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