我已经开始使用MySQL作为数据库进行编程了一段时间,我知道基本的SQL查询直到包含最多两个表的简单JOINS。
但是,当我需要从3个或更多表中获得结果时,我被困住了。无论我怎么努力,我仍然设法让自己迷失方向。我到处搜索寻找一个关于如何处理复杂SQL查询的好教程,但没有找到解释如何解决它的任何东西。大多数教程都包含针对特定问题的解决方案,但它们并没有解释如何解决问题的完美一般程序
在复杂查询方面,任何人都可以解释从头到尾的基本通用方式,如何构建查询等。
例如:
我有一个具有以下数据库结构的论坛:
forumCategory:
id | name | desc
forumTopic :
id | category_id | created_on | created_by | title | content
forumPost :
id | topic_id | created_on | created_by
用户:
id | first_name | last_name
所有主题都在forumTopic
表格中创建。对该主题的所有回复都将插入forumPost
表中。
现在在论坛主页上,我需要显示类别,用户在该特定类别中发布的最后一篇帖子,即发布最后一篇帖子的用户。
我想到的流程是:
通过查看按topic_id分组的forumPost表中的MAX(id)查找类别中的最后一篇文章。这将获得每个主题中最后一篇文章的ID。
现在再次找到按category_id分组的MAX(我之前获得的IDS)。这将使我获得每个类别的最后一篇文章。
ID是自动增加主键。
但是我从上面的算法
中构建了一个SQL查询如果有人可以帮我解决这个问题,那将会非常有帮助。
答案 0 :(得分:1)
通过加入Post to Topic
获取每个类别的最后一篇文章SELECT category_id , category.name, Max(ForumPost.ID) as maxpostid
from ForumPost
inner join ForumTopic on ForumPost.Topic_ID = ForumTopic.ID
inner join ForumCategory on ForumTopic.Category_Id = ForumCategory.ID
group by category_Id, category.name
(这是出于解释目的的中间阶段 - 它包含在下面的查询中)
然后将此连接到用户表以找出用户名(可能是帖子有用户ID?)
select users.name, lastposts.*
from
forumpost
inner join
(
SELECT category_id , category.name, Max(ForumPost.ID) as maxpostid
from ForumPost
inner join ForumTopic on ForumPost.Topic_ID = ForumTopic.ID
inner join ForumCategory on ForumTopic.Category_Id = ForumCategory.ID
group by category_Id, category.name
) lastposts
on forumpost.id = lastposts.maxpostid
inner join
users on forumpost.userid =users.id
但是,您可能需要考虑在每次发布帖子时使用最后一个帖子更新类别表。这样,您就可以为论坛首页运行更简单的查询。