2013-01-06 19 views
7

Ho 2 tabelle (membri, duty_sched) Desidero poter contare quante volte ciascun membro appare nella tabella duty_sched. Questo è ciò che ho dopo diverse settimane alla ricercaMySQL Left Join Count Non funziona

SELECT 
members.fname, 
members.lname, 
(SELECT COUNT(duty_sched.id) FROM duty_sched 
WHERE 'duty_sched.mbr_id' = 'members.mbr_id') AS shifts 

FROM members 
ORDER BY members.lname, members.fname 

L'uscita sto ottenendo è tutti zero, quello che vorrei per mostrare me è:

Nome sposta Bob Smith 4 Jane Johnson 2

Qualsiasi aiuto che posso ottenere sarà molto apprezzato.

+0

Ciao, ho provato la tua query su dump table che ho. la tua struttura è giusta prova a contare (*) e controlla le tue condizioni. –

risposta

7

Rimuovere le virgolette singole: WHERE duty_sched.mbr_id = members.mbr_id)

È inoltre possibile scrivere la query con un LEFT JOIN:

SELECT 
    m.fname, 
    m.lname, 
    COUNT(d.id) AS shifts 
FROM members AS m 
    LEFT JOIN duty_sched AS d 
    ON d.mbr_id = m.mbr_id 
GROUP BY 
    m.mbr_id      -- the Primary Key of `members` 
ORDER BY 
    m.lname, m.fname ; 
+0

mbr_id è un VARCHAR composto da varie informazioni sulle colonne, questo fa la differenza? –

+0

Modifica, la tua domanda, aggiungi l'output di 'SHOW CREATE TABLE members' e dati reali, alcune righe della tabella. –

+0

Ho aggiunto una colonna INT a entrambe le tabelle per scopi di ID e una volta che ho unito le due colonne INT ha funzionato perfettamente. Grazie per tutto quello che hai fatto. –

0

si può provare qualcosa di simile

SELECT 
members.fname, 
members.lname, 
count(*) FROM duty_sched JOIN members 
WHERE duty_sched.mbr_id = members.mbr_id 
Group by duty_sched.mbr_id 
ORDER BY members.lname, members.fname 
0

Prova questo:

SELECT m.fname, m.lname, IFNULL(A.shifts, 0) shifts 
FROM members m 
LEFT JOIN (SELECT mbr_id, COUNT(id) shifts 
      FROM duty_sched GROUP BY mbr_id) A ON m.mbr_id = A.mbr_id 
ORDER BY m.lname, m.fname;