4 votes

SQL : Obtenir le COUNT d'une table et JOIN les autres

J'ai une requête qui ressemble à ceci :

SELECT COUNT(A.Value1) AS Count, B.id AS Id1, C.id AS Id2
FROM Table1 A LEFT JOIN Table2 B ON (B.Name LIKE '%UserInput1%')
LEFT JOIN Table3 C ON (C.Name LIKE '%UserInput2%')
WHERE A.Value1 LIKE 'CertainValue'

La requête s'exécute parfaitement ; c'est juste que le fichier COMPTER Je reçois de Table1 ne me donne pas le compte réel du nombre de Value1 en Table1 mais plutôt le nombre de Value1 multiplié par le nombre de tables qui sont effectivement jointes.

Y a-t-il un moyen d'obtenir le COMPTER à partir du tableau 1 qui correspond aux critères de A.Value1 LIKE 'CertainValue' tout en rejoignant les autres tables ?

FYI : J'utilise MySQL !

3voto

Holger Brandt Points 3969

Eh bien, je suppose que vous pouvez ajouter DISTINCT a su COUNT .

SELECT COUNT(DISTINCT A.Value1) AS Count, B.id AS Id1, C.id AS Id2
FROM Table1 A LEFT JOIN Table2 B ON (B.Name LIKE '%UserInput1%')
LEFT JOIN Table3 C ON (C.Name LIKE '%UserInput2%')
WHERE A.Value1 LIKE 'CertainValue'

L'ensemble de la requête n'est vraiment pas très joli puisque vous joignez des tables qui ne semblent avoir aucune relation entre elles. Le jeu de résultats devrait être assez désordonné.

2voto

Barmar Points 135986

Le problème est que vous effectuez le comptage après la jointure, donc vous comptez le nombre de A.Value1 dans le produit croisé résultant. Si vous voulez le compte de la table originale, vous devez utiliser une sous-requête. Je ne pense pas que cela causera un problème de performance, cela devrait même l'améliorer, puisque cela réduit la taille de la jointure résultante.

SELECT ACount, B.id AS Id1, C.id AS Id2
FROM (Select COUNT(*) ACount FROM Table1 WHERE Value1 LIKE 'CertainValue') A 
LEFT JOIN Table2 B ON (B.Name LIKE '%UserInput1%')
LEFT JOIN Table3 C ON (C.Name LIKE '%UserInput2%')

0voto

Ampersand Points 1

La requête telle qu'elle est écrite renvoie un produit cartésien car A, B et C ne sont pas du tout joints. De plus, count est un mot-clé, il est préférable d'utiliser un autre identifiant dans le select. Essayez d'écrire la requête comme quelque chose comme ceci :

SELECT COUNT(A.Value1) AS MyCount, B.id AS Id1, C.id AS Id2
FROM Table1 A
LEFT JOIN Table2 B ON A.?? = B.??
LEFT JOIN Table3 C ON A.?? = C.??
WHERE A.Value1 LIKE '%CertainValue%'
AND B.Name LIKE '%UserInput1%'
AND C.Name LIKE '%UserInput1%'
GROUP BY B.id, C.id

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X