我正在为我的团队创建锻炼日志。我目前拥有的是一个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技能有点缺乏。我希望有人能够对我正在寻找的理想查询有所了解。感谢您的帮助!
答案 0 :(得分:1)
听起来您想同时使用GROUP BY
,ORDER BY
和TOP
。
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版本中被删除)。而是考虑使用MySQLi或PDO的预准备语句。
using PDO here有很多很好的例子,在这里使用MySQLi。