Группировка по MySQL беспорядок - PullRequest
0 голосов
/ 23 августа 2009

У меня действительно есть проблема с выяснением этого.

У меня есть таблица «Комментарии»:

cmt_id (primary key, auto incr), thread_id, cmt_text

И у меня есть эти записи:

cmt_id   thread_id       cmt_txt
5002     1251035762511   Alright, I second this. 
5003     1251036148894   Yet another comment.
5001     1251035762511   I am starting a thread on this.

Я хочу получить минимальную запись cmt_id в КАЖДОМ потоке. Итак, я сделал запрос агрегации следующим образом:

SELECT cmt_id, thread_id, cmt_text, MIN(cmt_id) FROM comments 
GROUP BY thread_id;

Однако я получаю следующее:

cmt_id   thread_id    cmt_text                    MIN(cmt_id)
5002    1251035762511   Alright, I second this.     5001
5003    1251036148894   Yet another comment.        5003

Для потока с thread_id "1251035762511" я всегда получаю комментарий с cmt_id 5002 в качестве записи с минимальным идентификатором комментария. Я даже пытался вставить новые записи, cmt_id 5002 всегда идет как MIN не запись с cmt_id 5001.

Ответы [ 4 ]

1 голос
/ 23 августа 2009

Я не знаю, почему MySQL позволяет вам это делать, но обычно в SQL следующий запрос недопустим

SELECT cmt_id, thread_id, cmt_text, MIN(cmt_id) FROM comments 
GROUP BY thread_id;

Вы не сможете указать столбец SELECT, если он не

  1. A GROUP BY столбец
  2. Агрегирующая функция (например, MIN, MAX, COUNT, SUM ...)

В вашем случае я бы использовал этот выбор

SELECT cmt_id, thread_id, cmt_text FROM comments INNER JOIN (
  SELECT MAX(cmt_id) AS cmt_id FROM comments 
  GROUP BY thread_id
) a ON a.cmt_id = comments.cmt_id 
1 голос
/ 23 августа 2009

Вы должны иметь что-то в строках:

SELECT 
   cmt_id, 
   thread_id, 
   cmt_text 
FROM comments 
WHERE cmt_id IN (
         SELECT 
            MIN(cmt_id) 
         FROM comments 
         GROUP BY thread_id);

Так работает SQL: в вашем запросе он объединяет строки, оставляя не строку с min cmt_id, а случайную (или последнюю, но я бы на это не рассчитывал). В приведенном выше запросе он сначала найдет все мини-коды, а затем получит расширенную информацию для каждого из них.

0 голосов
/ 23 августа 2009
SELECT *
FROM comments
     INNER JOIN (
       SELECT cmt_id = MIN(cmt_id), thread_id
       FROM comments
       GROUP BY thread_id
     ) cmin ON cmin.cmt_id = comments.cmt_id
0 голосов
/ 23 августа 2009

Это может быть просто опечатка, но введенный вами SQL-запрос содержит MIN (cmt_id), а не MAX (cmt_id).

SELECT cmt_id, thread_id, cmt_text, MIN(cmt_id) FROM comments 
GROUP BY thread_id;

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

Если вам нужен максимальный идентификатор комментария, тогда

SELECT MAX(cmt_id), thread_id FROM comments GROUP BY thread_id

будет достаточно. Если вам нужно дополнительное поле, вам нужно использовать подзапрос, как и в других ответах здесь.

...