Выберите наиболее встречающееся значение в MySQL - PullRequest
5 голосов
/ 15 июля 2010

Я ищу способ выбрать наиболее часто встречающееся значение, например, человека, который опубликовал больше всего для каждой темы;

SELECT MOST_OCCURRING(user_id) FROM thread_posts GROUP BY thread_id

Есть ли хороший способ сделать это?

Ответы [ 3 ]

9 голосов
/ 15 июля 2010

Если вы хотите рассчитывать на основе потока, я думаю, вы можете использовать вложенный запрос;группировка сначала по потоку, а затем по пользователю:

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
3 голосов
/ 15 июля 2010

Это будет табулировать вхождения user_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.

2 голосов
/ 15 июля 2010

Существует множество примеров, если вы проверяете вопросы под тегом "наибольший 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
...