Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mySQL在一个查询中从多个表获取信息_Mysql_Database - Fatal编程技术网

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

mySQL在一个查询中从多个表获取信息,mysql,database,Mysql,Database,我对SQL非常陌生,在尝试了一些不同的google搜索并阅读了一些SQL教程之后,似乎无法获得所需的信息 我认为这涉及到某种连接,但无法将它们直接连接起来 给定以下示例表: 表1(每次对任务进行更改时都会更新此活动,可能是每天多次): 表3(评论): 这意味着Bill在任务002关闭后更改了任务002,并添加了“干得好”的注释 任何帮助都将不胜感激 提前感谢。您需要使用JOIN语句从多个表中检索字段。 另外,您的表结构看起来有点冗余。是否计划根据日期加入表?那么你每天只有一次零钱 SELECT

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

我认为这涉及到某种连接,但无法将它们直接连接起来

给定以下示例表:

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

表3(评论):

这意味着Bill在任务002关闭后更改了任务002,并添加了“干得好”的注释

任何帮助都将不胜感激


提前感谢。

您需要使用JOIN语句从多个表中检索字段。


另外,您的表结构看起来有点冗余。

是否计划根据日期加入表?那么你每天只有一次零钱

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';
我认为您需要某种方法将注释中的一行与活动中的正确行相关联。现在,如果两个人在同一天对给定的任务发表评论,你不知道谁的评论是谁的。我建议您为活动中的每一行指定一个唯一的键,然后从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不支持外键引用。

在我看来,他使用Task.ID作为主键,其他表没有主键,仅将其ID字段用作Task.ID的外来项。我计划确定开发人员是否在任务关闭后对其进行了操作,因此我假设日期是关键?关闭日期之后的活动日期?它可以在一天内更改多次。也许您可以发布表的定义,包括外键和主键。例如,表1的主键是什么?表2和表1是如何相关的?按Id?所有表都按Id关联。我想我需要确定的第一件事是,任务结束后是否添加了活动,然后找出谁做了活动,他们做了什么活动,什么时候做的活动,以及他们的注释是什么。Totty的解决方案从当前已结束的任务中获取所有注释,包括那些在任务结束前做的。谢谢比尔,我想这一个得到了我需要的信息。不幸的是,我无法更新或对数据库进行任何更改。任务ID在任务表中是唯一的,“when”在活动表中是唯一的(实际上是毫秒的时间戳)。好的,如果它是时间戳,那么两个人不太可能在完全相同的时间发表评论,我上面给出的第一个查询应该可以工作。记住向上投票,并为您认为最好的答案选择绿色复选标记。:-)
Who What    ID  When    Comment
Bill Updated 002 2008-10-03 "Nice job"
SELECT Activity.Who, Activity.What, Comments.When, Comments.Comment FROM Activity JOIN Comments ON Activity.ID = Comments.ID JOIN Tasks ON Comments.ID = Tasks.ID WHERE Tasks.Status = 'Closed'
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';
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';