mysql - 构建复杂 SQL 查询的技巧

标签 mysql sql join subquery

我已经开始使用 PHP 使用 MySQL 作为数据库进行编程了一段时间,我知道基本的 SQL 查询到包含最多两个表的简单 JOINS。

但是当我需要从 3 个或更多表中获取结果时,我陷入了困境。不管我多么努力,我还是发现自己迷路了。我到处搜索寻找关于如何处理复杂 SQL 查询的好教程,但没有找到任何解释如何去做的内容。大多数教程包含针对特定问题的解决方案,但它们没有解释如何着手解决问题的完美一般过程

当涉及到复杂查询时,任何人都可以解释从头到尾的基本通用方法、如何构建查询等。

例如:

我有一个具有以下数据库结构的论坛:

论坛类别:

id | name | desc

论坛主题:

id | category_id | created_on | created_by | title | content

论坛帖子:

id | topic_id | created_on | created_by

用户:

id | first_name | last_name

所有主题都在 forumTopic 表中创建。对该主题的所有回复都插入到 forumPost 表中。

现在在论坛主页上,我需要显示类别、用户在该特定类别中发布的最后一个帖子,即发布最后一个帖子的用户。

我想到的流程是:

  1. 通过查看按 topic_id 分组的 forumPost 表中的 MAX(id),找到类别中的最后一篇帖子。这将使我获得每个主题中最后一篇文章的 ID。

  2. 现在再次找到按 category_id 分组的 MAX(我之前得到的 IDS)。这将使我获得每个类别的最后一篇文章。

ID 是自动递增的主键。

但是我无法根据上述算法构建 SQL 查询

如果有人可以帮助我解决这个问题,那将非常有帮助。

最佳答案

通过加入 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

但是,您可能需要考虑在每次发布帖子时使用最新帖子更新类别表。这样您就可以为您的论坛首页运行一个更简单的查询。

关于mysql - 构建复杂 SQL 查询的技巧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11575346/

相关文章:

mysql - 为一对多表关系创建连接查询

php - 再次卡在加载 UTF-8 字符上

mysql - SQLAlchemy:使用不同类型键的表之间的关系?

mysql - 如何在 MySQL 中使用 LAST_INSERT_ID 关键字传递表名?

SQL Server 2005 - 检查空日期时间值

SQL:级联 UNION 和 JOIN

c# - 如果值已更改 C#,则将参数从文本框发送到存储过程

MySQL动态变量被截断

php - 尝试插入时出现 SQL 语法错误

php - JOINed mySQL 查询和 LIMIT