MySQL группа, вернув набор - PullRequest
1 голос
/ 14 марта 2012

Я знаю, что есть много подобных тем, относящихся к этому, но я не могу найти ту, которая соответствует моей ситуации.

То, что я ищу, - это оператор mysql, который позволит мне группировать по user_id и возвращать набор максимального идентификатора (id не является уникальным столбцом).

Вот мои данные:

id      url_id  submit_date         engine  status  message
14738   3629    2009-01-02 18:43:55 0pn 10  NULL
14738   3629    2009-01-02 18:43:55 Abacho  10  NULL
14738   3629    2009-01-02 18:43:55 Acoon   10  NULL
14739   3629    2009-01-02 18:43:55 Alexa   10  NULL
14739   3629    2009-01-02 18:43:55 Amfibi  10  NULL
14739   3629    2009-01-02 18:43:55 Burf    10  NULL
14740   4115    2009-01-02 18:43:55 0pn 10  NULL
14740   4115    2009-01-02 18:43:55 Abacho  10  NULL
14740   4115    2009-01-02 18:43:55 Acoon   10  NULL
14741   4115    2009-01-02 18:43:55 Alexa   10  NULL
14741   4115    2009-01-02 18:43:55 Amfibi  10  NULL
14741   4115    2009-01-02 18:43:55 Burf    10  NULL

Вот мое заявление sql:

SELECT * FROM table WHERE url_id IN (3629,4115) group by url_id having max(id);

Проблема в том, что оператор выводит только верхнюю поисковую систему для этого набора. Мне нужны все поисковые системы, включенные в этот набор идентификаторов. Я также не хочу использовать вложенные операторы SQL, поскольку это приводит к значительному снижению производительности.

Ответы [ 2 ]

1 голос
/ 14 марта 2012
SELECT * FROM table A,
(SELECT * FROM table WHERE url_id IN (3629,4115) group by url_id having max(id)) B
WHERE A.id=B.id;
0 голосов
/ 14 марта 2012

Поскольку вы упоминаете, что хотели бы избежать использования подзапросов и производных таблиц, попробуйте использовать самоисключающее соединение.
Объяснение: с помощью самообъединения мы создаем еще одну таблицу, с которой можно сравнить первую таблицу, чтобы найти самую последнюю id, то есть строку (строки) без большего значения id для каждого url_id. * 1005. *

SELECT t.* 
  FROM yourtable t 
       LEFT JOIN yourtable t2 
       ON t2.url_id = t.url_id
   AND t2.id > t.id
 WHERE t.url_id IN (3629,4115)
   AND t2.id IS NULL;

Что возвращает это (я пропустил последние два столбца при тестировании b / c, они не имеют значения в этом примере):

14739   3629    2009-01-02 18:43:55 Alexa
14739   3629    2009-01-02 18:43:55 Amfibi
14739   3629    2009-01-02 18:43:55 Burf
14741   4115    2009-01-02 18:43:55 Alexa
14741   4115    2009-01-02 18:43:55 Amfibi
14741   4115    2009-01-02 18:43:55 Burf

SQLized здесь . (Самостоятельные объединения не поддерживаются, поэтому одна и та же таблица определяется и заполняется дважды.)

...