【发布时间】:2009-09-20 16:25:46
【问题描述】:
我正在与 kohana 建立一个论坛。我知道那里已经有很好的免费论坛软件,但它是针对家庭网站的,所以我想我会将它用作学习体验。我也没有使用 Kohana 内置的 ORM,因为我想在构建论坛的过程中了解有关 SQL 的更多信息。
对于我的论坛,我有 4 个主要表格:
USERSTOPICSPOSTSCOMMENTS
TOPICS 表:id(自动递增),主题行。
USERS 表:用户名、电子邮件、名字和姓氏以及其他一些不相关的行
POSTS 表:id(自动递增)、post-title、post-body、topic-id、user-id、post-date、updated-date、update-by(将包含最近发表评论的人的用户 ID)
COMMENTS 表:id(自动递增)、post-id、user-id 和评论
在主论坛页面上我想要:
- 所有主题的列表
- 每个主题的帖子数
- 最后更新的帖子,以及更新者
- 最近更新的主题位于顶部,很可能是“ORDER BY updated-date”
这是我目前的查询:
SELECT topics.id AS topic-id,
topics.topic,
post-user.id AS user-id,
CONCAT_WS(' ', post-user.first-name, post-user.last-name) AS name,
recent-post.id AS post-id,
post-num.post-total,
recent-post.title AS post-title,
recent-post.update_date AS updated-date,
recent-post.updated-by AS updated-by
FROM topics
JOIN (SELECT posts.topic-id,
COUNT(*) AS post-total
FROM POSTS
WHERE posts.topic-id = topic-id
GROUP BY posts.topic-id) AS post-num ON topics.id = post-num.topic-id
JOIN (SELECT posts.*
FROM posts
ORDER BY posts.update-date DESC) AS recent-post ON topics.id = recent-post.topic-id
JOIN (SELECT users.*,
posts.user-id
FROM users, posts
WHERE posts.user-id = users.id) as post-user ON recent-post.user_id = post-user.id
GROUP BY topics.id
此查询几乎可以正常工作,因为它会获取包含帖子的主题的所有信息。 但它不会返回没有任何帖子的主题。
我确信该查询效率低下且错误,因为它对帖子表进行了两次子选择,但这是我能达到我现在的目的的唯一方法。
【问题讨论】:
-
我现在明白为什么格式化 SQL 查询也很重要
-
@rexem - 感谢您为我清理这些内容,这是我的第一篇 SO 帖子,我不确定我可以添加多少 html 标记。