如何通过列获得不同的行?

时间:2016-11-16 16:33:09

标签: php mysql sql distinct

我有大量的行,我想说,从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

我该怎么做?

3 个答案:

答案 0 :(得分: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必须是要正确分区的第一个条件。

答案 1 :(得分:0)

从您的查询中执行此操作。

"SELECT * FROM table GROUP BY user_id ORDER BY news_id DESC LIMIT 5"

答案 2 :(得分:-1)

嗯,我认为这将实现你的目标。

select user_id, news_id, title from tableName
   GROUP BY user_id 
   ORDER BY news_id DESC
   LIMIT 0,5

希望这有帮助!