2015-01-29 2 views
0

На моем форуме я использую базу данных с posts таблицей:MySQL автообъединение таблицу

enter image description here

  • type может быть вопрос, ответ или замечание ('Q', 'A', ' N ')
  • updated является дата, на которую после последнего обновления
  • postid представляет собой целое число, идентифицирующий пост
  • parentid представляет собой целое число со ссылкой на родительский пост (NULL на вопросы, относится к вопросу ответов, относится к вопросу или ответу на ноты)

Как создать таблицу, связывающую postid каждый вопрос с postid последнего связанного с ним ответа/примечания?

Я предполагаю, что для этого требуется тройной СОЕДИНЕНИЕ, но для меня это очень ново.

ответ

1

Вы можете сделать это:

SELECT 
    p.postid, 
    answersAndNotes.postid AS AnswerOrNoteId, 
    answersAndNotes.updatedDate AS AnswerOrNoteUpdateDate 
FROM posts p 
INNER JOIN 
(
    SELECT 
    parentid, 
    postid, 
    MAX(updated) AS updatedDate 
    FROM posts 
    WHERE `type` = 'A' OR `type` = 'N' 
    GROUP BY postid 
) AS answersAndNotes ON answersAndNotes.parentid = p.postid 
WHERE p.type = 'Q'; 

подзапрос:

SELECT 
    parentid, 
    postid, 
    MIN(updated) AS updatedDate 
    FROM posts 
    WHERE `type` = 'A' OR `type` = 'N' 
    GROUP BY postid 

Даст вам ответы на эти вопросы или заметки и только самые последние из них, если есть notetext или другие столбцы, которые вы хотите чтобы добавить их в этот подзапрос и в GROUP BY.

+0

Большое спасибо, пока он неплохо работает, но приводит к дублированию. Поэтому, когда я пытаюсь добавить результат запроса к моей новой таблице (где 'postid' является' PRIMARY KEY'), он дает: * Ошибка запроса MySQL 1062: Дублирующая запись '154' для ключа 'PRIMARY' * –

+1

@Bruno Эта ошибка указывает, что значения, которые вы вводите в postid, содержат несколько повторяющихся значений для 154, снова проверьте свои значения. –

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