2011-09-22 13 views
5

Ho una semplice tabella di lingue/id modello:MySQL Left Join Subselect

lingua | modello

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

Template è sempre o t1, t2, o t3. In totale ci sono 3 lingue: en, au, ge.

C'è un sacco ulteriori informazioni nella tabella, sto solo mostrando ciò che è rilevante a questa domanda, userò i dati per la rappresentazione grafica e così bisogno di tornare in questo 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

Conta tuttavia molte occorrenze di modelli presenti in ciascuna lingua. Ma, il problema che ho è di restituire un conteggio zero se non ci sono ID di modello per quella lingua particolare nella tabella.

Stavo pensando che sarebbe stata necessaria una sorta di selezione secondaria di join a sinistra sull'id del modello per assicurarsi che i 3 ID modello venissero restituiti per ogni lingua?

+0

perché non scrivi l'SQL, quindi possiamo vedere dove (o se) ci sono errori? – Martin

+0

C'è anche una tabella di modelli e/o una tabella di lingue? O questa unica tabella è l'unica fonte di questi dati? –

+0

selezionare a.template, count (a.template) come count, a.language, dalla tabella a join sinistro (selezionare distinto (modello) dalla tabella) b su a.template = b.template group by a.template , a.language order di a.language, a.template – StuR

risposta

5

Ci potrebbe essere un modo migliore di fare questo, e non ho ancora testato in MySQL, ma le seguenti opere in 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 

Ecco i risultati con i dati di esempio:

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

Perfetto, proprio quello che cercavo e funziona bene in MySQL. Grazie per l'aiuto. – 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 ho dato una prova anche se sto ancora ottenendo lo stesso che vorrei usare la query nel mio commento sopra (nessun valore zero). Inoltre, perché il primo gruppo sulla lingua non dovrebbe essere a.template, a.language? – StuR

0

Quello che ti serve sono due tabelle che elencano i valori possibili per lingua e modello.

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

allora si può fare qualcosa di simile:

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

L'utilizzo di due tabelle equivale a "FROM (seleziona distinto (lingua) dalla tabella) l CROSS JOIN (seleziona distinto (modello) dalla tabella) t" nel tuo codice precedente non è vero? Ho dato questo risultato anche se ottengo gli stessi risultati della risposta qui sotto. – StuR