2015-07-05 3 views
5

Я пытаюсь выяснить, на каком языке пользователь отвечает больше всего, а возврат user_id, language_id, они отвечают в большинстве случаев и сколько раз у них есть ответы.Использование MAX() и COUNT() в том же запросе

Я начал SELECT ING таблицы/суб-таблица, которая возвращает эти результаты:

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 

Эта таблица возвращающую user_id, в language_id, и сколько раз language_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_results таблице хранятся ответы на эти переводы и соответствующие user_id ,

Таким образом, чтобы подвести итог таблицы и получить user_id, их наиболее ответил language_id, и сколько раз они ответили, что language_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 

Я знаю, что это зависит от группы по из two clauses, но если я только группа по user_id и не включают в себя to_language_id в отдельных моих колонках, я не могу знать, какие respectiv e language_id - наиболее ответивший. Я также пробовал подзапросы и несколько подключений, но я считаю, что мне постоянно нужно использовать MAX(t1.answers), независимо от выбранных столбцов, и таким образом разрушает мои надежды на совпадение group by. Как я могу свернуть запрос правильно, а не group by найти все уникальные комбинации MAX()user_id и to_language_id?

+0

Привет вы можете создать [SQL Fiddle] (http://sqlfiddle.com/) с некоторыми данными и добавить к вашему вопросу желаемый результат? tnx –

ответ

1

Чтобы получить:

user_id, их наиболее отвечал language_id, и сколько раз они ответили в том, что LANGUAGE_ID

вы можете использовать переменные:

SELECT user_id, language_id, answers 
FROM (
    SELECT user_id, language_id, answers, 
     @rn:= IF(@uid = user_id, 
        IF(@uid:=user_id, @rn:[email protected]+1, @rn:[email protected]+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 

Там это ограничение, однако, в вышеуказанном запросе: если имеется более одного language_id, использующих один и тот же м максимальное количество ответов для user_id, тогда будет возвращен только один.

Demo here

Альтернативный способ состоит в использовании запросе дважды в качестве производной таблицы:

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 

Этот запрос не имеет ограничения предыдущего запроса, но, вероятно, будет менее эффективным по сравнению с предыдущим.

Demo here

+0

Удивительный ответ, отличная демонстрация и хорошее объяснение. спасибо –

0

Если я undestood вашего вопроса, вы должны определить временную или производную таблицу с результатом подзапроса, позволяет вызов sub_selected, то вы должны сделать:

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)