2008-11-06 6 views
2
 
SELECT `name` , COUNT(*) AS `count` 
FROM `t1`, `t2` 
WHERE `t2`.`id` = `t1`.`id` 
GROUP BY `t2`.`id` 

Je souhaite obtenir le nom de t1 et le nombre de lignes dans t2 où l'ID est le même que sur t1.Nombre de tables croisées MySQL (*) Aide à la requête

J'ai ce qui précède à ce jour, mais il ne reviendra pas de données s'il n'y a pas de lignes dans t2 qui correspondent. Je préfère count être 0 (ou NULL) s'il n'y a pas de lignes, et le nom revient encore. Je voudrais pouvoir trier par count en descendant. (ou name ASC) est-ce possible?

Répondre

3

Cela devrait fonctionner pour vous:

SELECT `t1`.`id` , COUNT(`t2`.`id`) AS `count` 
FROM `t1` LEFT JOIN `t2` ON `t1`.`id` = `t2`.`id` 
GROUP BY `t1`.`id` 

jointure gauche vous garantit toutes les lignes de t1 et COUNT (t2id.) Fait il ne compte que les enregistrements où t2.id est non nul (c'est - celles qui existent vraiment t2)

+0

Merci pour votre aide. J'aimerais pouvoir trier par le «compte» décroissant. (ou 'nom' ASC) est-ce possible? – Steve

+0

Hm ... votre solution montre « 1 » pour 'count' s'il y a maintenant des lignes de t2 – Steve

+0

ajouter juste « Trier par nombre DESC » à la fin – Dheer

0

Faire un syndicat pour obtenir l'autre ensemble

SELECT `name` , COUNT(*) AS `count` 
FROM `t1`, `t2` 
WHERE `t2`.`id` = `t1`.`id` 
GROUP BY `t2`.`id` 
UNION 
Select name, 0 as count 
from t1 
where NOT EXISTS (select 1 from t2 where `t2`.`id` = `t1`.`id`) 
+0

Merci pour votre aide. Est-ce le moyen le plus efficace/élégant? Existe-t-il un moyen de faire cela en utilisant JOINs? – Steve

1

ce genre descendant par le comte, et dans même compte monter par name. Les noms sans lignes t2 retourneront avec un compte de 0.

SELECT 
    `t1`.`name`, 
    COUNT(`t2`.`id`) AS `count` 
FROM 
    `t1` 
    LEFT JOIN `t2` ON`t2`.`id` = `t1`.`id` 
GROUP BY 
    `t1`.`name` 
ORDER BY 
    COUNT(`t2`.`id`) DESC, 
    `t1`.`name` 

Modifier ORDER BY à vos besoins.

+0

Cheers, cependant 'count' affiche '1' quand il n'y a pas de lignes dans t2 – Steve

+0

Oh. sûr. Je vais corriger cela. – Tomalak