Я создаю небольшой форум.
Попытка выполнить запрос SElECT... JOIN...
также забирает информацию об отдельных сообщениях плюс последний ответ (если есть). Как часть моего желания сделать все трудным путем, это охватывает пять таблиц (указываются только столбцы, относящиеся к этой проблеме)
commentInfo referenceID | referenceType | authorID | create
postit id | title
postitInfo referencePostitID | create | authorID
user id | username | permission
userInfo referenceUserID | title
Итак, я запускаю этот запрос SELECT... JOIN...
, чтобы получить самые последние темы и их последние ответы.
SELECT DISTINCT
t1.id, t1.title, t2.create, t2.lastEdit, t2.authorID, t3.username,
t4.title AS userTitle, t3.permission, t5.create AS commentCreate,
t5.authorID AS commentAuthor, t6.username AS commentUsername,
t6.permission AS commentPermission
FROM rantPostit AS t1
LEFT JOIN (rantPostitInfo AS t2)
ON ( t1.id = t2.referencePostitID)
LEFT OUTER JOIN (rantUser as t3, rantUserInfo as t4)
ON (t2.authorId = t3.id AND t4.referenceUserId = t2.authorId)
LEFT OUTER JOIN (rantCommentInfo as t5, rantUser as t6)
ON (t5.referenceType = 8 AND t5.referenceID = t1.id AND t6.id = t5.authorID)
ORDER BY t2.create DESC, t5.create DESC
Теперь это возвращает сообщения в теме. Скажем, у меня есть два из них, он возвращает оба хорошо. Скажем, у меня есть восемь ответов на первый, он вернет 9 записей (по одному для каждой темы + ответ, а другой - без ответов). Итак, я предполагаю, что моя проблема заключается в следующем: я не знаю, что делать, чтобы ограничить число возвращений в последнем предложении LEFT OUTER JOIN
только самыми последними или просто вычеркнуть наименее последние из окна.
(Да, я понимаю, что предложение ORDER BY...
испорчено, так как сначала упорядочит его по дате создания поста, а затем по дате создания комментария. Да, я понимаю, что могу упростить все свои проблемы, добавив два поля в postitInfo, lastCommentCreate и lastCommentCreateID, и они обновляются каждый раз при получении ответа, но ... мне нравится трудный путь.)
Так что я делаю не так?
Или это такая бессмысленная проблема, что меня нужно обвести вокруг сарая и бить молотком?