2009-08-24 10 views
4

J'ai deux séries de résultats:Comment les requêtes syndicales de la même table dans MySQL

SELECT name, count(appearance) as countA from table where results = '1' 
SELECT name, count(appearance) as countB from table where results = '2' 

et je voulais les combiner côte à côte, comme ceci:

+---------+---------+---------+ 
| col_1 | countA | countB | 
+---------+---------+---------+ 
| John | 3 | 1 | 
| Mary | 1 | 2 | 
| Gary | 2 | NULL | 
| Sean | 4 | NULL | 
| Mike | NULL | 6 | 
+---------+---------+---------+ 

Comment puis-je fais ça?

Répondre

4

Cela devrait le faire (Oracle) sans avoir besoin d'un auto rejoindre

SELECT name 
    , sum(case results when '1' then 1 else 0 end) as countA 
    , sum(case results when '2' then 1 else 0 end) as countB 
    from table 
where results IN ('1', '2') 
group by 
     name 
+0

Cela fonctionne également dans MySQL. –

+0

Oui, c'est ce que je cherche. Merci^_ ^ – Khairul

-1
SELECT name, count(appearance) as countA, null AS countB from table where results = '1' 
UNION ALL 
SELECT name, null AS countA, count(appearance) as countB from table where results = '2' 
1

Vous pouvez utiliser une jointure réflexive comme suit

select a.col_1, a.countA, b.countB from table a, table b 
where a.col_1 = b.col_1 and a.results='1' and b.results='2' 
+0

L'OP veut énumérer tous 'col_1' et placez NULL dans la colonne' count' sans enregistrements correspondants. –

-1
SELECT `table`.name, countA, countB 
FROM tab 
LEFT OUTER JOIN 
    (SELECT name, count(appearance) as countA from `table` where result = '1' group by name) as tmp1 
ON `table`.name = tmp1.name 
LEFT OUTER JOIN 
    (SELECT name, count(appearance) as countB from `table` where result = '2' group by name) as tmp2 
ON `table`.name = tmp2.name; 
Questions connexes