2008-10-23 6 views
4

Je suis terriblement nouveau à SQL, et ne peut pas sembler obtenir l'information désirée, après avoir essayé quelques recherches google différentes, et lire quelques tutoriels SQL. Je pense que cela implique une sorte de jointure, mais je ne peux pas les obtenir directement.mySQL obtenir des informations à partir de plusieurs tables dans une requête

Compte tenu des exemples de tableaux suivants:

Tableau 1 (activité Ceci est mis à jour chaque fois qu'une modification est apportée à une tâche, pourrait être manytimes par jour):

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> 

Tableau 2 (tâches - C'est la principale table de suivi des tâches):

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

tableau 3 (Commentaires):

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" 

Quelle requête SQL (mySQL si elle fait une différence) utiliserais-je pour savoir qui a fait quelque chose sur une tâche qui a été fermée?

Les résultats seraient quelque chose comme:

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

Ce qui signifie que le projet de loi a changé la tâche 002 après avoir été fermé, et a ajouté le commentaire « Nice job »

Toute aide serait grandement appréciée.

Merci d'avance.

+0

Peut-être que vous pouvez publier les définitions des tables, y compris les clés étrangères et les clés primaires. Quelle est la clé primaire du tableau 1 par exemple? Comment sont liés le tableau 2 et le tableau 1? Par Id? –

+0

Toutes les tables sont liées par ID. Je pense que la première chose que je dois déterminer est de savoir si une activité a été ajoutée après la fermeture de la tâche, puis de savoir qui a fait l'activité, quelle activité ils ont pris, quand ils l'ont prise et quel était leur commentaire. – CalvinTreg

Répondre

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

Je pense que vous avez besoin d'un moyen d'associer une ligne dans Commentaires à la ligne correcte dans Activité. À l'heure actuelle, si deux personnes commentent une tâche donnée le même jour, vous ne savez pas à qui appartient le commentaire. Je vous recommande de donner à chaque ligne de l'activité une clé unique, puis de la référencer dans la table des commentaires.

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; 

Ensuite, vous pouvez créer des associations de sorte que la requête renvoie des résultats plus précis:

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

Assurez-vous d'utiliser TYPE=InnoDB dans MySQL, car le moteur de stockage par défaut MyISAM ne supporte pas les références clés étrangères.

+0

Merci Bill, je pense que celui-ci obtient l'information dont j'ai besoin. Malheureusement, je ne suis pas en mesure de mettre à jour ou de modifier la base de données. L'ID de tâche est unique dans la table des tâches, "when" est unique (en fait un horodatage de la miliseconde) dans la table d'activité. – CalvinTreg

+0

OK, s'il s'agit d'un horodatage, il est très improbable que deux personnes puissent commenter exactement au même moment, et la première requête que je vais faire ci-dessus devrait fonctionner. Rappelez-vous d'upvote et sélectionnez la coche verte pour la réponse qui vous semble la meilleure. :-) –

+0

Je vous ajouterais cent fois si je pouvais! Vous avez sauvé mon 4 $$ big time !!!! –

2

Vous devrez utiliser une instruction JOIN pour extraire les champs de plusieurs tables. 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' 

En outre, vous êtes la structure la table semble avoir un peu de redondance.

+0

Merci pour le lien, il y a quelques bonnes infos là-bas. – CalvinTreg

+0

La solution de Totty reçoit tous les commentaires d'une tâche actuellement fermée, y compris ceux qui ont été effectués avant la fermeture de la tâche. –

0

Avez-vous l'intention de joindre les tables en fonction de la date? Donc, vous aurez seulement 1 changement par jour?

+0

Il me semble qu'il utilise Task.ID comme une clé primaire et n'a pas de clé primaire pour les autres tables, en utilisant seulement leurs champs ID comme des étrangers de Task.ID. – Totty

+0

Je prévois de savoir si un développeur a agi sur une tâche après sa fermeture, donc je suppose que la date est la clé? Une date d'activité après la date de clôture? – CalvinTreg

+0

Il peut être changé plusieurs fois par jour. – CalvinTreg

Questions connexes