2010-11-11 16 views
1

Il y a une table hypothétique appelée Tableau 1, avec les colonnes:MySQL - comptent les différents champs de conditions différentes dans une table jointe

  • id
  • condition 1
  • condition 2
  • joinable_key

Il en existe un autre, Main_Table, dont l'ID correspond à la clé joinable dans le premier.

Je voudrais les joindre d'une telle manière que je puisse compter les rangées de Table1 en fonction de la condition 1 et de la condition 2 séparément - c'est-à-dire, je voudrais pouvoir "count (Table1.condition1) en tant que first_condition, comptez (Table1.condtion2) comme second_condition "sur la requête select.

La requête serait probablement ressembler à quelque chose comme ceci:

SELECT Main_Table.some_column, COUNT(Table1.condition1) AS first_condition, COUNT(Table1.condtion2) AS second_condition 
FROM Main_Table 
LEFT JOIN Table1 AS T1 on (T1.joinable_key = Main_Table.id AND T1.condition1 = 'something') 
LEFT JOIN Table1 AS T2 on (T2.joinable_key = Main_Table.id AND T2.condition2 = 'something else') 
GROUP BY (Main_Table.id) 

Lorsque cela exécute, cependant, les deux résultats de comptage sont égaux, et se multiplient en fait les uns aux autres. Il est impératif que tous les résultats soient inclus dans la sortie finale - y compris ceux qui n'ont aucune entrée de Table1 - c'est-à-dire, s'il n'y a pas de ligne dans Table1 avec une clé joinable égale à Main_Table.id . Avant que quelqu'un ne suggère de faire deux requêtes distinctes et de le gérer via PHP - oui, je sais pourquoi et comment cela peut être fait, mais mon objectif est de savoir si ce multi-compte peut être fait tout en un question.

Merci

+0

double possible de [comptage de plusieurs lignes dans MySQL dans une requête] (http://stackoverflow.com/questions/2957269/counting-multiple-rows-in-mysql-in-one-query) – Konerak

Répondre

4
SELECT some_column, 
     (SELECT COUNT(1) 
      FROM Table1 
     WHERE mt.id = joinable_key 
      AND condition1 = 'something' 
     ) AS first_condition, 
     (SELECT COUNT(1) 
      FROM Table1 
     WHERE mt.id = joinable_key 
      AND condition2 = 'something else' 
     ) AS second_condition 
    FROM MainTable mt 
+0

Cette solution de sous-requête était la bonne, merci! – Swader

0
SELECT Main_Table.some_column, 
     SUM(t1.condition1 = 'something') AS first_condition, 
     SUM(t1.condition2 = 'something_else') AS second_condition 
FROM Main_Table 
LEFT JOIN 
     Table1 AS t1 
ON  t1.joinable_key = Main_Table.id 
     AND 
     (
     t1.condition1 = 'something' 
     OR 
     t1.condition2 = 'something else' 
     ) 
GROUP BY 
     Main_Table.id 

Si les deux condition1 et condition2 sont sélectifs, cette syntaxe peut être plus efficace:

SELECT Main_Table.some_column, 
     (
     SELECT COUNT(*) 
     FROM table1 t1 
     WHERE t1.joinable_key = main_table.id 
       AND t1.condition1 = 'something' 
     ), 
     (
     SELECT COUNT(*) 
     FROM table1 t1 
     WHERE t1.joinable_key = main_table.id 
       AND t1.condition2 = 'something_else' 
     ) 
FROM Main_Table 

Vous devez créer les indices suivants:

table1 (id, condition1) 
table1 (id, condition2) 

pour ceci pour travailler vite.

+0

I s'excuser de ne pas avoir répondu plus tôt. Je ferai de mon mieux pour tester cela correctement dès que possible. – Swader