mySQL在一个查询中从多个表中获取信息

标签 mysql database

我对 SQL 非常陌生,在尝试了一些不同的谷歌搜索并阅读了一些 SQL 教程之后,似乎无法获得所需的信息。

我认为它涉及某种连接,但无法直接连接。

给定以下示例表:

表 1(Activity 每次对任务进行更改时都会更新,每天可能多次):

ID  Who     What        When
001 John    Created 2008-10-01<br>
001 Bill    Closed  2008-10-02<br>
001 John    Updated 2008-10-03<br>
002 Bill    Created 2008-10-04<br>
002 John    Updated 2008-10-05<br>
002 Bill    Closed  2008-10-06<br>

表 2(任务 - 这是主要任务跟踪表):

ID  Created Status
001 2008-10-01  Closed
002 2008-10-04  Closed

表 3(注释):

ID  When    Comment<br
001 2008-10-01  "I'm creating a new task"
001 2008-10-02  "I have completed the task"
001 2008-10-03  "Nice job"
002 2008-10-04  "I'm creating a second task"
002 2008-10-05  "This task looks too easy"
002 2008-10-06  "I have completed this easy task"

我将使用什么 SQL(mySQL,如果它有什么不同)查询来找出谁对已关闭的任务做了什么?

结果会是这样的:

Who What    ID  When    Comment
Bill Updated 002 2008-10-03 "Nice job"

意味着 Bill 在任务 002 关闭后更改了它,并添加了评论“Nice Job”

如有任何帮助,我们将不胜感激。

提前致谢。

最佳答案

SELECT a1.Who, a1.What, a1.ID, c.When, c.Comment
FROM Activity AS a1
  JOIN Activity AS a2 ON (a1.ID = a2.ID AND a1.When > a2.When)
  JOIN Comments AS c ON (a1.ID = c.ID AND a.When = c.When);
WHERE a2.What = 'Closed';

我认为您需要某种方式将评论中的一行与事件中的正确行相关联。现在如果两个人在同一天对给定的任务发表评论,你不知道谁的评论是谁的。我建议您为 Activity 中的每一行指定一个唯一键,然后从 Comments 表中引用它。

CREATE TABLE Tasks (
  Task_ID      INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
  Created      DATE NOT NULL,
  Status       VARCHAR(10)
) TYPE=InnoDB;

CREATE TABLE Activity (
  Activity_ID  INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
  Task_ID      INT NOT NULL REFERENCES Tasks,
  Who          VARCHAR(10) NOT NULL,
  What         VARCHAR(10) NOT NULL,
  When         DATE NOT NULL
) TYPE=InnoDB;

CREATE TABLE Comments (
  Comment_ID   INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
  Activity_ID  INT NOT NULL REFERENCES Activity,
  Who          VARCHAR(10) NOT NULL,
  When         DATE NOT NULL,
  Comment      VARCHAR(100) NOT NULL
) TYPE=InnoDB;

然后您可以进行关联,以便查询返回更准确的结果:

SELECT c.Who, a1.What, a1.Task_ID, c.When, c.Comment
FROM Activity AS a1
  JOIN Activity AS a2 ON (a1.Task_ID = a2.Task_ID AND a1.When > a2.When)
  JOIN Comments AS c ON (a1.Activity_ID = c.Activity_ID);
WHERE a2.What = 'Closed';

确保在 MySQL 中使用 TYPE=InnoDB,因为默认存储引擎 MyISAM 不支持外键引用。

关于mySQL在一个查询中从多个表中获取信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/231126/

相关文章:

database - 您会使用Cassandra进行汇总查询吗?

mysql - 无法从 Asterisk 拨号方案访问mysql数据库

php - Doctrine 不会在 Mysql 中保留具有 bool 值和 PDO::ATTR_EMULATE_PREPARES = false 的实体

mysql - SQLSTATE[42S22] : Column not found: 1054 Unknown column in my code

php - 使用 php exec 从导出的 sql 创建 mysql 数据库

database - dataStore 和数据库有什么区别?

php - 如何连接我的 mysql VM 和我的 Azure 网站

php - 使用mysql数据库从图像中获取信息

mysql - 从自定义到 WordPress 数据库的特色图像

MySQL:导入时忽略错误?