MySQL group by после объединения # 1064 ошибка - PullRequest
1 голос
/ 02 марта 2012

У меня есть 2 таблицы, из которых я должен получить последние 10 активных идентификаторов проекта, основываясь на дате. Запрос:

(
SELECT project_posts.projectid as projectId, `project_posts`.`date` as rowDate
FROM `project_posts` ORDER BY `project_posts`.id DESC
)
UNION ALL
(SELECT `project_comments`.projectid as projectId, project_comments.`date` as rowDate FROM `project_comments` ORDER BY `project_comments`.id DESC) GROUP BY projectId ORDER BY rowDate DESC LIMIT 10

И я хочу отсортировать его по rowDate DESC (последний проект первым). Проблема в том, что когда я добавляю группу MySQL, он говорит:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use
near 'GROUP BY projectId ORDER BY rowDate DESC LIMIT 6' at line 9

Я искал в интернете проблемы с union, union all и group by, но не нашел решения. Заранее спасибо.

1 Ответ

6 голосов
/ 02 марта 2012

Я думаю, что вам нужно создать производную таблицу из вашего запроса объединения, прежде чем вы сможете сгруппировать ее -

SELECT projectId, MAX(rowDate) AS rowDate
FROM (
    (
        SELECT project_posts.projectid as projectId, `project_posts`.`date` as rowDate 
        FROM `project_posts`
    ) UNION ALL (
        SELECT `project_comments`.projectid as projectId, project_comments.`date` as rowDate
        FROM `project_comments`
    )
) AS tmp
GROUP BY projectId
ORDER BY rowDate DESC
LIMIT 10

У меня не было возможности попробовать это, но она должна делать то, что вам нужно -

SELECT p.id, GREATEST(IFNULL(MAX(pc.date), 0), IFNULL(MAX(pp.date), 0)) AS max_date
FROM projects p
LEFT JOIN project_comments pc
    ON p.id = pc.projectid
LEFT JOIN project_posts pp
    ON p.id = pp.projectid
GROUP BY p.id
ORDER BY max_date DESC
LIMIT 10

ОБНОВЛЕНИЕ Запрос на основе UNION должен быть значительно быстрее, чем этот второй запрос.Я провел несколько грубых тестов с использованием фиктивных данных (100 тыс. Проектов, 200 тыс. Публикаций и 700 тыс. Комментариев), а запрос многопользовательского объединения занимает в три-пять раз больше времени, чем запрос UNION.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...