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