MySQL получает информацию из нескольких таблиц в одном запросе - PullRequest
4 голосов
/ 23 октября 2008

Я ужасно плохо знаком с SQL и, похоже, не могу получить нужную информацию после того, как попробовал несколько разных поисков в Google и прочитал некоторые учебники по SQL.

Я думаю, что это связано с какими-то соединениями, но не может их получить прямо.

Приведены следующие примеры таблиц:

Таблица 1 (Задание обновляется каждый раз, когда в задачу вносится изменение, может происходить много раз в день):

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"

Это означает, что Билл изменил задачу 002 после того, как она была закрыта, и добавил комментарий "Хорошая работа"

Любая помощь будет принята с благодарностью.

Заранее спасибо.

Ответы [ 3 ]

7 голосов
/ 24 октября 2008
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 уникальный ключ, а затем сослаться на него из таблицы комментариев.

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';

Обязательно используйте TYPE=InnoDB в MySQL, потому что механизм хранения по умолчанию MyISAM не поддерживает ссылки на внешние ключи.

2 голосов
/ 23 октября 2008

Вам нужно будет использовать оператор JOIN для извлечения полей из нескольких таблиц. http://www.w3schools.com/Sql/sql_join.asp

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'

Кроме того, ваша структура таблиц выглядит немного избыточной.

0 голосов
/ 23 октября 2008

Планируете ли вы присоединиться к таблицам на основе даты? Таким образом, у вас будет только 1 смена в день?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...