2010-11-18 1 views
0

У меня есть 2 таблицы:Проблема с MySQL запроса

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

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 

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

Любая помощь оценивается. Thanks

+0

Вы можете разместить некоторые выборочные данные в таблицы, чтобы показать, как именно вы хотите, чтобы вывод будет генерироваться из сохраненных данных? (Например, просто удаление «GROUP BY» теперь работает, но я не думаю, что это то, чего вы в конечном итоге хотите) ... – ircmaxell

+0

Если я удалю группу, я получу все ответы. Например, если у меня есть один вопрос с двумя ответами, у меня будет две строки, показывающие этот вопрос, а не один. Если у меня есть вопросы X, я хочу получить X строк при выполнении запроса, поэтому только последний ответ/вопрос, – FinalDestiny

ответ

2

Старая проблема. Вот решение: 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

Я хотел бы сделать это только с 1 запросом, без подзапросов. – FinalDestiny

+0

Тогда, может быть, просто используйте решение с LEFT JOIN !? – AndreKR

+0

У меня есть две разные таблицы, а не только один из них. Поэтому я не могу понять, как это сделать. Можете ли вы мне немного помочь с запросом? Спасибо, – FinalDestiny

0

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

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

+0

Это отлично работает для qa.id, но qa.message ошибочен, но первый. Например, я хочу найти последнего пользователя, который ответил на это сообщение, MAX здесь не будет работать, – FinalDestiny

+0

Нет, это даст произвольное сообщение для qa.message, а не последнее. – AndreKR

+0

Я тестировал и да, сообщение было испорчено, вот оно, функционально с подзапросом, но его не так красиво, как AndreKR's: p –

 Смежные вопросы

  • Нет связанных вопросов^_^