【发布时间】:2016-11-16 16:33:09
【问题描述】:
我有大量的行,我想说,从 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
我该怎么做?
【问题讨论】:
-
删除 WHERE。你也不需要 DISTINCT。
-
WHERE GROUP BY会抛出错误mysql_error()。阅读有关 SELECT dev.mysql.com/doc/refman/5.7/en/select.html 的手册 - 您还缺少FROM table。 -
请不要再使用
mysql_*函数了。它们在 PHP 5.5 中被弃用,它太旧了,不再接收安全更新,并在 PHP 7 中完全删除。改用 PDO 或mysqli_*。详情请见stackoverflow.com/questions/12859942/…。 -
@aynber:没有它的工作位置,但问题是..我在数据库中有值为 0 的 user_id(它不是由我插入的,我只是在上面实现新的例程网站),我还需要过滤。我怎样才能删除它们?
-
@Chris:这是我正在维护的旧代码库的一部分,我会编辑它,至少现在不会,但无论如何谢谢