2011-09-22 19 views
5

Tengo una simple tabla de idiomas/id de plantilla:MySQL Left Join Subselect

idioma | plantilla

en, t1
en, t1
au, t2
ge, t3
en, t1
ge, t2
ge, t3 Plantilla

es siempre bien t1, t2, o t3. En total hay 3 idiomas: en, au, ge.

Hay mucha más información de la tabla, sólo estoy mostrando lo que es relevante a esta pregunta, que va a utilizar los datos para la representación gráfica y por lo tanto necesitan que regresar en este formato:

en, t1, 3
en, t2, 0
en, t3, 0
au, t1, 0 ​​
au, t2, 1
au, t3, 0
ge, t1, 0 ​​
ge, t2, 1
ge, t3, 2

Esto cuenta cuantas veces ocurran las plantillas en cada idioma. Pero, el problema que tengo es devolver un conteo cero si no hay identificadores de plantilla para ese idioma en particular en la tabla.

¿Estaba pensando que necesitaría algún tipo de sub selección de la izquierda en la identificación de la plantilla para asegurarse de que se devuelvan las 3 id de la plantilla para cada idioma?

+0

¿por qué no escribe el SQL, por lo que podemos ver dónde (o si) hay errores? – Martin

+0

¿Existe también una tabla de plantillas y/o una tabla de idiomas? ¿O es esta única tabla la única fuente de estos datos? –

+0

seleccione a.template, count (a.template) como count, a.language, de la tabla a left join (seleccione distinct (plantilla) de la tabla) b en a.template = b.template group por a.template , a.language order by a.language, a.template – StuR

Respuesta

5

Puede haber una mejor manera de hacer esto, y yo no lo he probado en MySQL, pero los siguientes trabajos de SQL Server 2005 :

Select a.language, b.template, count (c.template) as combo_count 
from 
(select distinct language from tablename) as a 
inner join (select distinct template from tablename) as b on 1 < 2 /* this could be cross join, same thing. */ 
left outer join tablename c on c.language = a.language and c.template = b.template 
group by a.language, b.template 
order by 1, 2 

Éstos son los resultados con los datos de la muestra:

au t1 0 
au t2 1 
au t3 0 
en t1 3 
en t2 0 
en t3 0 
ge t1 0 
ge t2 1 
ge t3 2 
+0

Perfecto, justo lo que buscaba y funciona bien en MySQL. Gracias por tu ayuda. – StuR

0
Select a.language, a.template, Count(*) count 
    From (Select Distinct language, template From table) a 
    Left Join table b 
     On b.language = a.language 
      And b.template = b.template 
    Group By a.language, a.template 
+0

I He probado esto, aunque sigo obteniendo lo mismo que usaría la consulta en mi comentario anterior (sin valores cero). Además, ¿por qué grupo primero en lenguaje no debería ser a.template, a.language? – StuR

0

Lo que necesita son dos tablas que enumeren los posibles valores para el idioma y la plantilla.

CREATE TABLE language (...) AS SELECT DISTINCT language FROM your_table; 
CREATE TABLE template (...) AS SELECT DISTINCT template FROM your_table; 

entonces usted puede hacer algo como esto:

SELECT l.language, t.template, SUM(CASE WHEN yours.language IS NULL THEN 0 ELSE 1 END) count 
FROM language l CROSS JOIN template t 
LEFT OUTER JOIN your_table yours ON l.language = yours.language AND t.template = yours.template 
GROUP BY l.language, t.template; 
+1

Usar dos tablas sería lo mismo que hacer: "FROM (seleccionar distinct (language) de la tabla) l CROSS JOIN (seleccionar distinct (plantilla) de la tabla) t" en el código anterior, ¿o no? He dado una oportunidad, aunque obtengo los mismos resultados que en la respuesta a continuación. – StuR