Select count(*) et “join” de plus de 3 tables

Je suis à la recherche pour un nombre de requête dans une jointure de 3 tables qui peut me faire des comptages sur des valeurs distinctes de l'une de ces tables.

J'ai 3 tables que j'ai besoin de les joindre pour obtenir les données attendues (Workflow, Message et Message_Workflow_Relation).

Je veux obtenir le nombre de flux de travail regroupées par état + un champ de l'connectés Message table dans mon résultat (related_name). Connexes nom doit être prise à partir d'entrées où l' adapter champ est égal à wf, cependant il y a parfois plus d'un enregistrement de Message correspondant à cette condition, ce qui se traduira par plus de jeux de données dans mon décompte de ceux qui sont vraiment là.

Je suis assez sûr il doit être possible de sortir de la , mais il suffit de ne pas le faire fonctionner.
Malheureusement je ne peux pas changer la structure de la table comme c'est un schéma d'un produit que nous utilisons.

Mon tableau de structure ressemble à ceci:

Processus:

id | workflow_id | starttime | endtime | status
------------------------------------------------------
1  |          22 |         0 |     200 |     OK
2  |          23 |       220 |     920 |  ERROR
3  |          55 |       202 |     588 |     OK

Message_Workflow_Relation:

id | message_id | workflow_id |
-------------------------------
1  |        122 |          22 |
2  |        235 |          22 |
3  |        456 |          22 |
4  |        982 |          22 |
5  |        444 |          23 |
6  |        445 |          23 |
7  |        585 |          55 |
8  |        738 |          55 |
9  |        399 |          55 |

Message:

id | message_id | starttime | endtime | adapter | related_name |
----------------------------------------------------------------
 1 |        122 |         0 |    2335 |      wf |   workflow_1 |
 2 |        235 |       222 |    1000 |   other |        other |
 3 |        456 |       343 |    2330 | another |      another |
 4 |        982 |       222 |    2200 |      wf |   workflow_1 |
 5 |        444 |      2223 |    3333 |      wf |   workflow_2 |
 6 |        445 |      1123 |    1244 |  manual |       manual |
 7 |        585 |      5555 |    5566 |      wf |   workflow_1 |
 8 |        738 |       655 |     999 |      wf |   worfklow_1 |
 9 |        399 |      6655 |    7732 | another |      another |

Il doit retourner le résultat suivant:

count(*) | related_name | status |
----------------------------------
       2 |   workflow_1 |     OK |
       1 |   workflow_2 |  ERROR |

Je suis coincé avec cette déclaration suivante, mais je ne suis pas sûr de savoir comment
faire la sélection sur la adapter = wf unique pour chaque flux de travail:

select distinct
  count(*),
  m.related_name,
  w.status
from
  workflow as w,
  message as m,
  msg_bpm_rel as rel
where rel.workflow_id = w.workflow_id
  and rel.message_id = m.message_id
  and m.adapter = 'PE'
group by m.related_name,w.status

Cela me renvoie (4 workflow_1 au lieu de 2):

count(*) | related_name | status |
----------------------------------
       4 |   workflow_1 |     OK |
       1 |   workflow_2 |  ERROR |

Comment puis-je faire une requête appropriée pour y parvenir?

Toute aide appréciée.

Je vous ai donné une réponse déjà, mais la lecture de votre post, encore et encore, j'ai l'impression qui me manque quelques informations. Je ne vois pas de valeur distincte qui n'existe que deux fois pour workflow_1, c'est soit 4 fois ou une seule fois. Donc, soit je suis absent une table. Quelle colonne exactement êtes-vous essayer de compter? (count(*) en général, est une mauvaise idée de l'omi, en particulier lors de l'adhésion)

OriginalL'auteur Sebastian | 2011-03-01