簡體   English   中英

如何通過列獲得不同的行?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM