Проблема с запросом MySQL - PullRequest
0 голосов
/ 18 ноября 2010

У меня есть 2 таблицы:

Таблица вопросов со следующей структурой:

id
title
userid
date

и таблица ответов со следующей структурой:

id
idquestion
userid
message
date

Я хочу показать все вопросы и последний ответ на этот вопрос.

Например, если у нас есть 5 вопросов, я бы хотел получить что-то вроде этого:

id    title   message   messagedate
1     qs 1    mess 1    2010-11-18
2     qs 2    mess 2    2010-11-19
3     qs 3    mess 3    2010-11-20
4     qs 4    mess 4    2010-11-21

Мой запрос пока:

    SELECT q.id, qa.id as answerid, title, qa.message 
      FROM `questions` q 
INNER JOIN questions_answers qa 
        ON q.id = qa.idquestion 
  GROUP BY q.id 
  ORDER BY q.id, answerid DESC

Но он работает неправильно, он группируется по идентификатору вопроса (удаляя все остальные сообщения столбцов, оставляя только первое сообщение - так что порядок по ним бесполезен)

Любая помощь приветствуется. Спасибо

Ответы [ 2 ]

2 голосов
/ 18 ноября 2010

Старая проблема. Вот решение: http://dev.mysql.com/doc/refman/5.1/en/example-maximum-column-group-row.html

В вашем случае:

SELECT q.id, qa.id as answerid, title, qa.message 
FROM questions q
JOIN questions_answers qa ON q.id = qa.idquestion
LEFT JOIN questions_answers qa2 ON qa.idquestion = qa2.idquestion AND qa.date < qa2.date
WHERE qa2.idquestion IS NULL

(Идея состоит в том, чтобы разбить проблему на две операции: объединить вопросы и ответы, а затем использовать методы из статьи MySQL.)

0 голосов
/ 18 ноября 2010

Ну, вы могли бы подойти к этому по-другому. Вы используете внутреннее объединение, что означает, что вы все равно не будете отображать вопросы без ответа, поэтому найдите максимальный ответ, сгруппированный по идентификатору вопроса, и объедините таблицу вопросов, чтобы получить заголовок.

SELECT q.id, qa.id as answerid, q.title, qa.message FROM questions q INNER JOIN question_answers qa ON q.id = qa.idquestion AND qa.id IN (SELECT MAX(id) FROM question_answers WHERE idquestion = q.id) GROUP BY q.id ORDER BY q.id DESC

...