Nous utilisons un système de gestion de projet en ligne, et j'essaie de l'étendre un peu.Assistance avec requête multi-table SQL - renvoi des résultats en double
Il a les tables d'intérêt suivants:
todo_itemStatus: +--------------+-----------------------+------+-----+---------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+-----------------------+------+-----+---------------------+----------------+ | itemStatusId | bigint(20) unsigned | NO | PRI | NULL | auto_increment | | itemId | int(10) unsigned | NO | MUL | 0 | | | statusDate | datetime | NO | | 0000-00-00 00:00:00 | | | statusKey | tinyint(3) unsigned | NO | | 0 | | | memberId | mediumint(8) unsigned | NO | | 0 | | +--------------+-----------------------+------+-----+---------------------+----------------+
Ce tableau garde la trace quand une tâche est terminée, et maintient également l'état de tous les changements de la tâche.
Il existe alors une table de projet et une table 'article' (ou tâche).
Je veux essentiellement être en mesure d'extraire une liste de projets, avec des détails sur le pourcentage de tâches terminées. Cependant, pour l'instant je serais heureux si je pouvais juste énumérer chaque tâche dans un projet avec des détails sur s'ils sont complets. Pour autant que je sache, la meilleure façon d'obtenir le statut le plus récent d'une tâche est de choisir un todo_itemStatus où le statusDate est le plus récent, ou le itemStatusId est le plus grand alors que itemId est égal à la tâche que je suis. intéressé.
J'ai essayé une requête comme ceci:
<pre>
select todo_item.itemId, todo_item.title, todo_itemStatus.statusKey, todo_itemStatus.statusDate
from todo_item, todo_project, todo_itemStatus
where todo_item.projectId = todo_project.projectId
and todo_project.projectId = 13
and todo_itemStatus.itemId = todo_item.itemId
and todo_itemStatus.statusDate = (
select MAX(todo_itemStatus.statusDate)
from todo_itemStatus key1 where todo_itemStatus.itemId = key1.itemId);
</pre>
Cependant, cela donne toutes les mises à jour d'état avec une sortie comme ceci:
+--------+-----------------------------------------------------------------------------+-----------+---------------------+ | itemId | title | statusKey | statusDate | +--------+-----------------------------------------------------------------------------+-----------+---------------------+ | 579 | test complete item - delete me | 1 | 2009-07-28 13:04:38 | | 579 | test complete item - delete me | 0 | 2009-07-28 14:12:12 | +--------+-----------------------------------------------------------------------------+-----------+---------------------+
Ce qui est pas ce que je veux, comme je veux seulement un entrée de tâche retournant avec le statusKey/statusDate de l'entrée la plus récente dans la table todo_itemStatus.
Je sais que j'ai été un peu vague dans ma description, mais je n'ai pas voulu écrire un message massivement long. Je peux fournir beaucoup plus de détails si nécessaire.
S'il vous plaît quelqu'un peut-il suggérer ce que je fais mal? Cela fait longtemps que je n'ai pas fait de base de données, donc je ne sais pas très bien ce que je fais ici ...
Merci beaucoup! Dave
Salut, merci, mais je ne pense pas que DISTINCT fera ce que je veux. Le problème est qu'ils sont plusieurs entrées todo_itemStatus par todo_item, et je veux juste obtenir le plus récent. Je pourrais toutefois avoir tord...mais un test rapide a juste donné une erreur ... – DaveS
Ouais, relisez juste votre question et je pense qu'en fait un GROUP BY est ce qui est nécessaire - essayant de trouver quelque chose pour vous atm. – Justin
Merci pour cela. Je vais jeter un coup d'oeil à cet article, puis relire votre message et vous laisser savoir comment je m'entends. Je vous remercie! – DaveS