MySQL排序前十名

时间:2014-05-13 04:29:07

标签: php mysql

我正在为我的团队创建锻炼日志。我目前拥有的是一个MySQL查询(用PHP编写),它检索与本周发布的帖子相关的用户ID数组。代码如下:

mysql_query("SELECT u_id FROM posts WHERE id IN (SELECT p_id FROM post_groups WHERE g_id='" . $group['id']. "') AND date >= '" . $d_start . "' AND date <= '" . $d_end . "'");

为了更好地解释这一点,假设一位u_id = 6用户本周发布了五次训练。上述查询生成的数组总共应包含6五次。这是针对本周用户发布的每个训练所做的 - 所以我最终得到一个充满重复用户ID的大阵列。

我要做的是,返回一个大小为10的数组,其中包含上面数组中最常出现的u_id。所以,如果u_id = 6出现在上面的数组中最频繁,让我们说10次,u_id = 8出现次数最多,让我们说9次,那么我希望返回的数组将有一个值6位于[0],值8位于[1]等。

我不确定如何减少这个数组并按最常见的u_id排序,因为此时我的SQL技能有点缺乏。我希望有人能够对我正在寻找的理想查询有所了解。感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

听起来您想同时使用GROUP BYORDER BYTOP

GROUP BY会按特定字段对结果进行分组,在这种情况下,您希望按u_id进行分组。

GROUP BY u_id

ORDER BY可让您订购结果集。在此示例中,您希望按COUNT()对每个用户拥有的行数进行分组。我们还使用DESC关键字按降序排列(从最高到最低)。

ORDER BY COUNT(u_id) DESC

TOP让您只获得前X个结果。在下面的示例中,仅返回前10行。

TOP 10

所以将它们放在一起,按用户ID分组,按降序排列每个用户ID的计数,并将结果限制为10:

SELECT u_id 
FROM posts 
WHERE id IN 
  (SELECT p_id 
   FROM post_groups 
   WHERE g_id='" . $group['id']. "') 
AND date >= '" . $d_start . "' 
AND date <= '" . $d_end . "'
GROUP BY u_id
ORDER BY COUNT(u_id) DESC
LIMIT 10

旁注...... really shouldn't be using the mysql_* functions in new code。它们不再被维护,并且是officially deprecated(意味着它们将在未来的PHP版本中被删除)。而是考虑使用MySQLiPDO的预准备语句。

using PDO here有很多很好的例子,在这里使用MySQLi