![](/img/trans.png)
[英]How do I get distinct values from the table along with the count of how many rows there are containing that value
[英]How do I get distinct rows by a column?
我有很多行,我想說,從10個不同的用戶插入該數據庫的最后5條記錄。 如果同一個用戶將最后3行插入數據庫,我們必須得到一行,跳過其他兩行並移動以獲得每個用戶一行,直到它計數到5。
像這樣的數據庫:
user_id | news_id | title
1 | 1 | foo-1
2 | 2 | foo-2
3 | 3 | foo-3
1 | 4 | baa
4 | 5 | baa0
5 | 6 | baa1
5 | 7 | baa2
6 | 8 | baa3
7 | 9 | baa4
應該返回:
user_id | news_id | title
1 | 1 | foo-1
2 | 2 | foo-2
3 | 3 | foo-3
4 | 5 | baa0
5 | 6 | baa1
當前過濾器由PHP完成,如下所示:
$used = array();
while ($data = mysql_fetch_array($query)) {
$uid = $data['user_id'];
if(in_array($uid, $used))
continue;
array_push($used, $uid);
// do something with data
}
但是我想重構它,並且如果可能的話,完全由mysql做過濾器。 我不太了解MySql,這就是為什么我有問題歸檔這個...
這是我嘗試過的
select DISTINCT(user_id), news_id, title from XXX
WHERE GROUP BY (news_id) DESC
LIMIT 0,5
我怎樣才能做到這一點?
1種方法是為每個用戶生成一個分區行號,然后選擇5個記錄,其中RowNumber = 1。
SELECT *
FROM
(
SELECT
d.user_id
,d.news_id
,d.title
,(@rn:= if(@uid = user_id, @rn + 1,
if(@uid:=user_id,1,1)
)
) as RowNumber
FROM
Data d
CROSS JOIN (SELECT @uid:=-1, @rn:=0) vars
ORDER BY
user_id
,news_id
) t
WHERE
t.RowNumber = 1
ORDER BY news_id
LIMIT 5;
http://rextester.com/JRIZI7402 - 示例顯示它正常工作
注意,您可以通過簡單地更改派生表的ORDER BY語句來更改行順序,這樣如果您有一個表示最新記錄的列,例如您可以使用的標識列或日期時間列,但user_id必須是第一個標准要正確分區。
從您的查詢中執行。
"SELECT * FROM table GROUP BY user_id ORDER BY news_id DESC LIMIT 5"
好吧,我認為這將實現你所追求的目標。
select user_id, news_id, title from tableName
GROUP BY user_id
ORDER BY news_id DESC
LIMIT 0,5
希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.