Я создаю простой форум. Мне нужно отобразить список с последними темами и рядом с каждой темой последний ответ/сообщение. Что-то вроде:Не возвращать все строки с ЛЕВЫМИ СОЕДИНЕНИЯМИ И НУЖНЫМИ
Topic name: | Last reply:
Topic name 1 here | 2013-02-01 by username1
Topic name 2 here | 2013-01-01 by username2
etc.
Дело в том, что Темы и ответы находятся в одной таблице под названием «страницы». В этой таблице есть шаблон поля, который содержит, конечно, ID для шаблонов таблицы.
Так что я просто присоединиться шаблоны и фильтр по Template.name для записи «Форум на тему»
Это будет возвращать все темы. Поскольку мне также нужен был последний ответ для каждой темы, я решил сделать подзапрос с фильтром по одному и тому же шаблону, но теперь для записи «Ответ на форум» и упорядочен по адресу Reply.date DESC и с LIMIT 1, который возвращает последний ответ для Эта тема. Теперь пришло время, чтобы показать мой текущий запрос, который прекрасно работает для Темы, которые содержат по крайней мере 1 ответ:
/*----some fields to return----*/
SELECT TopicContent.title, ReplyContent.title, Reply.date, Reply.id,
(
/*----subquery to return latest reply id used inside HAVING later on----*/
SELECT Reply.id
FROM pages AS Reply
INNER JOIN templates AS Template ON Reply.template = Template.id
WHERE Reply.parent_id = Topic.id
AND Template.name = 'Forum reply'
ORDER BY Reply.date DESC
LIMIT 1
) AS reply_id
FROM pages AS Topic
INNER JOIN templates AS Template ON Topic.template = Template.id
INNER JOIN page_content AS TopicContent ON Topic.id = TopicContent.page
/*----left join used because topic could have zero replies if new----*/
LEFT JOIN pages AS Reply ON Topic.id = Reply.parent_id
LEFT JOIN page_content AS ReplyContent ON Reply.id = ReplyContent.page
WHERE Template.name = 'Forum topic'
HAVING Reply.id = reply_id
/*--------------------------------------------------------------------------------*/
/*----HAVING | returns not all topics but with correct latest reply----*/
/*----GROUP BY Topic.id | returns topics correctly but incorrect latest reply-----*/
Наиболее важным является то, что в настоящее время, если новая тема представляется не содержит никаких ответов пока нет.
Поэтому, когда я использую HAVING, он возвращает только те темы, которые также содержат хотя бы один ответ. И при использовании GROUP BY он не возвращает последние ответы для тем, которые содержат один или несколько ответов. И для тем, которые не содержат ответов, он возвращает NULL, что хорошо.
Нужно ли мне менять JOINS? Любые идеи для решения этой проблемы. Большое спасибо!
Благодарим вас за ответ. Можете ли вы объяснить, почему вы присоединяетесь к a.TemplateId = pages.TemplateId. Я попытался понять/разобраться, но, похоже, не работает. –
Возможно, потому, что я не совсем понимаю вашу структуру данных, но в вашем подзапросе вы присоединяетесь к таблице страниц в таблице шаблонов в этом столбце (я отредактирую ее, чтобы использовать те же имена, которые вы использовали). Вышесказанное должно дать вам общее решение. – Rick
Привет, бенджлис. Спасибо за вашу помощь. Хотя это не сработало. Я думаю, что это невозможно. Не на наших путях. Вот почему я решил осветить темы и ответы из таблицы страниц. Теперь я создаю темы и ответы на таблицы и меняю свой сценарий. Этот путь, конечно, лучший, и теперь у меня нет пустых полей на моей странице страниц, что тоже отлично. Просто было интересно, можно ли это сделать. –