选择MySQL中最常出现的值
我正在寻找一种方法来选择最常出现的值,例如,每个线程发布最多的人选择MySQL中最常出现的值,mysql,group-by,greatest-n-per-group,Mysql,Group By,Greatest N Per Group,我正在寻找一种方法来选择最常出现的值,例如,每个线程发布最多的人 SELECT MOST_OCCURRING(user_id) FROM thread_posts GROUP BY thread_id 有没有一个好的方法可以做到这一点?如果您想在每个线程的基础上进行计数,我认为您可以使用嵌套查询;先按线程分组,然后按用户分组: SELECT thread_id AS tid, (SELECT user_id FROM thread_posts WHERE thread
SELECT MOST_OCCURRING(user_id) FROM thread_posts GROUP BY thread_id
有没有一个好的方法可以做到这一点?如果您想在每个线程的基础上进行计数,我认为您可以使用嵌套查询;先按线程分组,然后按用户分组:
SELECT thread_id AS tid,
(SELECT user_id FROM thread_posts
WHERE thread_id = tid
GROUP BY user_id
ORDER BY COUNT(*) DESC
LIMIT 0,1) AS topUser
FROM thread_posts
GROUP BY thread_id
如果你在“每组最大n”标签下检查问题,会有很多例子。但在这种情况下,您不需要定义如何处理关系-如果两个或多个用户具有相同的计数值,该怎么办
SELECT DISTINCT
tp.thread_id,
tp.user_id
FROM THREAD_POSTS tp
JOIN (SELECT t.thread_id,
t.user_id,
COUNT(t.user_id) AS occurrence,
CASE
WHEN @thread != t.thread_id THEN @rownum := 1
ELSE @rownum := @rownum + 1
END AS rank,
@thread := t.thread_id
FROM THREAD_POSTS t
JOIN (SELECT @rownum := 0, @thread := -1) r
GROUP BY t.thread_id, t.user_id
ORDER BY t.thread_id, occurrence DESC) x ON x.thread_id = tp.thread_id
AND x.user_id = tp.user_id
AND x.rank = 1
这将列出每个线程出现的用户id
SELECT thread_id, user_id, COUNT(*) as postings
FROM thread_posts
GROUP BY thread_id, user_id
但您只希望为每个线程选择顶级用户
SELECT thread_id, user_id, postings
FROM (
SELECT thread_id, user_id, COUNT(*) as postings
FROM thread_posts
GROUP BY thread_id, user_id
)
HAVING postings = max(postings)
这相当于
SELECT thread_id, user_id, COUNT(*) as postings
FROM thread_posts
GROUP BY thread_id, user_id
HAVING postings = max(postings)
HAVING关键字通常与聚合操作一起使用,以挑选满足HAVING子句中条件的聚合输出行
HAVING子句不同于WHERE子句,其中HAVING子句过滤查询的结果输出。然而,WHERE子句过滤查询的输入数据。
由于HAVING子句过滤查询的结果输出,因此它必须出现在ORDER BY和GROUP BY子句之后。您想要每个线程一行的列表,并且相关的top POST user?不工作。运行此查询将提供空输出。mysql没有返回任何内容。