2013-05-05 65 views
2

我的表看起來像這樣(這只是一個例子):我想寫一個SQL語句來選擇每個名字的數量,以及該信息相關MySQIi SELECT COUNT和秩序由計數

id name title time 
---------------------------- 
1  name1 title1 1000 
2  name1 title1 1001 
3  name1 title1 1002 
4  name2 title2 1003 
5  name2 title2 1004 
6  name3 title3 1005 
7  name4 title4 1006 
8  name4 title4 1007 
9  name4 title4 1008 
10 name4 title4 1009 

到它。時間確實是一個UNIX時間戳,但我只是爲了簡化這個問題而改變了。

// This is will get me the trending posts for only the last minute 
$time_in_past = time() - 60; 
$mysqli->query(
    "SELECT COUNT(`id`) FROM `trending`........WHERE `time` < '$time_in_past'" 
); 

我想結果與PHP while()聲明取後是這樣的:

name: name4 count: 4 title: title4 
name: name1 count: 3 title: title1 
name: name2 count: 2 title: title2 
name: name3 count: 1 title: title3 

我希望他們能夠通過每個人同時還獲得10項結果中COUNT訂購(在這個例子中只有4)。

+0

我覺得我很難理解你想如何輸出10行,在你的例子輸出中你只有4行。什麼應該「仍然得到10個結果」看起來像? – halfer 2013-05-05 11:39:22

+0

這只是一個例子,我每分鐘輸入100k條記錄。所以會有超過4個輸出。你的sql查詢只顯示1個結果。 – 2013-05-05 11:40:42

回答

2

看起來你可以用一個簡單的GROUP BY完事了,這樣的事情:

SELECT name, COUNT(*), title 
FROM trending 
GROUP BY name, title 
ORDER BY COUNT(*) DESC; 

由於您的nametitle看起來從來沒有不同,因此將它們組合在一起不會給您更多的行。按DESC的順序可以按相反的順序進行計數。

+0

這隻顯示一個結果,我怎樣才能讓節目10? – 2013-05-05 11:27:02

+0

使用您提供的輸入表,_should_顯示四行,因爲我已將兩個列分組,每列有不同的值。你能用[SQL小提琴](http://sqlfiddle.com/)告訴我們你在哪裏?如果你能做到這一點,請將它編輯成你的問題,並且給我打電話,這樣每個人都可以看到更新。 – halfer 2013-05-05 11:35:43

+0

@Max:感謝您提出的問題更新,小提琴將是最好的下一步! – halfer 2013-05-05 11:44:25

4

你需要將你的結果(按名稱),然後將結果再次加入到你的餐桌:

SELECT * FROM trending NATURAL JOIN (
    SELECT name, COUNT(*) AS cnt 
    FROM  trending 
    WHERE time < ? 
    GROUP BY name 
) t 
WHERE time < ? 
ORDER BY t.cnt DESC