Mysql 在同一查询中使用MAX()和COUNT()
我试图找出用户回答最多的语言,然后通过Mysql 在同一查询中使用MAX()和COUNT(),mysql,Mysql,我试图找出用户回答最多的语言,然后通过user\u id返回,他们回答最多的language\u id,以及有多少次回答 我首先选择一个返回以下结果的表/子表: Table: `sub-selected` `user_id` `language_id` `answers` 1 1 1 2 1 1 1 2 5
user\u id
返回,他们回答最多的language\u id
,以及有多少次回答
我首先选择一个返回以下结果的表/子表:
Table: `sub-selected`
`user_id` `language_id` `answers`
1 1 1
2 1 1
1 2 5
2 2 2
1 4 3
1 5 1
此表返回用户id
,语言id
,以及用户回答该语言id
的次数。我使用此查询获取它:
SELECT t1.user_id, t2.to_language_id, COUNT(t2.to_language_id) as answers
FROM translation_results as t1
LEFT JOIN translations as t2
ON t2.translation_id = t1.translation_id
GROUP BY t2.to_language_id, t1.user_id
表格结构为:
Table: `translations`
`translation_id` `from_phrase_id` `to_language_id`
Table: `translation_results`
`translation_id` `result_id` PRI-AI `user_id`
translations
表存储所有请求的翻译,而translation\u results表存储这些翻译的答案和相应的用户id
因此,为了总结表格并获得用户id,他们回答最多的语言id
,以及他们回答该语言id
的次数,我使用了:
SELECT t1.user_id, t1.to_language_id, MAX(t1.answers)
FROM (
//The sub-table
SELECT t1.user_id, t2.to_language_id, COUNT(t2.to_language_id) as answers
FROM translation_results as t1
LEFT JOIN translations as t2
ON t2.translation_id = t1.translation_id
GROUP BY t2.to_language_id, t1.user_id
) as t1
GROUP BY t1.user_id, t1.to_language_id
但这不会将表折叠到所需的结构中,而是返回:
Table: `sub-selected`
`user_id` `language_id` `answers`
1 1 1
1 2 5
1 4 3
1 5 1
2 1 1
2 2 2
我知道它受两个子句的分组影响,但如果我只按用户id分组,而不在所选列中包含to语言id,我就不知道哪种语言id的回答最多。我也尝试过子查询和一些连接,但我发现我总是需要在所选列中使用MAX(t1.answers)
,这就破坏了我正确折叠组的希望。我如何才能正确折叠查询,而不是让group by
查找user\u id
和to\u language\u id
的所有唯一MAX()
组合?以获得:
用户id
,他们回答最多的语言id
,以及他们回答的次数
用那种语言回答
您可以使用以下变量:
SELECT user_id, language_id, answers
FROM (
SELECT user_id, language_id, answers,
@rn:= IF(@uid = user_id,
IF(@uid:=user_id, @rn:=@rn+1, @rn:=@rn+1),
IF(@uid:=user_id, @rn:=1, @rn:=1)) AS rn
FROM (SELECT t1.user_id, t2.to_language_id AS language_id,
COUNT(t2.to_language_id) as answers
FROM translation_results as t1
LEFT JOIN translations as t2
ON t2.translation_id = t1.translation_id
GROUP BY t2.to_language_id, t1.user_id
) t
CROSS JOIN (SELECT @rn:=0, @uid:=0) AS vars
ORDER BY user_id, answers DESC
) s
WHERE s.rn = 1
但是,上述查询存在一个限制:如果有多个语言id
共享一个用户id
的相同最大答案数,则只返回一个
另一种方法是将查询作为派生表使用两次:
SELECT t1.user_id, language_id, t1.answers
FROM (SELECT t1.user_id, t2.to_language_id AS language_id,
COUNT(t2.to_language_id) as answers
FROM translation_results as t1
LEFT JOIN translations as t2
ON t2.translation_id = t1.translation_id
GROUP BY t2.to_language_id, t1.user_id ) t1
INNER JOIN (
SELECT user_id, MAX(answers) AS answers
FROM (SELECT t1.user_id, t2.to_language_id,
COUNT(t2.to_language_id) as answers
FROM translation_results as t1
LEFT JOIN translations as t2
ON t2.translation_id = t1.translation_id
GROUP BY t2.to_language_id, t1.user_id
) t
GROUP BY user_id ) t2
ON t1.user_id = t2.user_id AND t1.answers = t2.answers
此查询没有上一个查询的限制,但与上一个查询相比可能效率较低
如果我不理解您的问题,您应该使用子查询的结果定义一个临时表或派生表,如果选择了“let call”sub\u,那么您应该执行以下操作:
SELECT t1.user_id, t1.to_language_id, answers
FROM sub_selected as t1
WHERE t1.answers =
(SELECT MAX(answers)
FROM sub_selected t2
WHERE t1.user_id = t2.user_id and t1.to_language_id = t2.language_id)
您好,您能用一些数据创建并添加到您的问题所需的输出吗?tnx