2011-01-31 14 views
23

Ho due tabelle: groups e group_members.MySQL si unisce e COUNT (*) da un'altra tabella

La tabella groups contiene tutte le informazioni per ogni gruppo, come il suo ID, titolo, descrizione, ecc

Nella tabella group_members, elenca tutti i membri che sono parte di ogni gruppo come questo:

group_id | user_id 
1 | 100 
2 | 23 
2 | 100 
9 | 601 

Fondamentalmente, desidero elencare TRE gruppi in una pagina e desidero solo elencare i gruppi con più di quattro membri. All'interno del ciclo <?php while ?>, voglio quindi quattro membri che fanno parte di quel gruppo. Non ho problemi ad elencare i gruppi e ad elencare i membri in un altro ciclo interno, non riesco a perfezionare i gruppi in modo che SOLO quelli con più di 4 membri mostrino.

Qualcuno sa come fare? Sono sicuro che è con i join MySQL.

risposta

49

MySQL usa la dichiarazione HAVING per questa attività.

Vostri criteri sarebbe simile a questa:

SELECT g.group_id, COUNT(m.member_id) AS members 
FROM groups AS g 
LEFT JOIN group_members AS m USING(group_id) 
GROUP BY g.group_id 
HAVING members > 4 

esempio quando i riferimenti hanno diversi nomi

SELECT g.id, COUNT(m.member_id) AS members 
FROM groups AS g 
LEFT JOIN group_members AS m ON g.id = m.group_id 
GROUP BY g.id 
HAVING members > 4 

Inoltre, assicurarsi di aver impostato gli indici all'interno del vostro schema di database per le chiavi in ​​uso nei join in quanto può influenzare le prestazioni del tuo sito.

+0

ho alterato lo SQL per adattare il mio codice: 'SELEZIONARE g.id, COUNT (m.id_profile) come membri DA groups_main AS g LEFT JOIN groups_fans AS m UTILIZZO (id) GROUP BY g.id membri aventi > 4' Risultati in questo errore MySQL: "ID colonna sconosciuta 'in' dalla clausola '. – hohner

+0

È possibile utilizzare l'istruzione USING solo se due colonne portano lo stesso nome, in altri casi utilizzare la dichiarazione ON aggiornando la mia risposta. – Nazariy

1

La tabella groups_main ha una colonna chiave denominata id. Credo che sia possibile utilizzare la sintassi USING per il join solo se la tabella groups_fans ha una colonna chiave con lo stesso nome, che probabilmente non lo è. Così, invece, provate questo:

LEFT JOIN groups_fans AS m ON m.group_id = g.id

O sostituire group_id con qualunque sia il nome della colonna appropriata è nella tabella groups_fans.

22
SELECT DISTINCT groups.id, 
     (SELECT COUNT(*) FROM group_members 
     WHERE member_id = groups.id) AS memberCount 
FROM groups 
+0

Grazie mille .. Questo mi ha aiutato a realizzare ciò che stavo cercando di fare. –

+0

Questo mi ha aiutato in una query con cui stavo lottando. Grazie. –

+0

Grazie per aver condiviso questo utile trucco. Mi aiuta molto. Sono stato usato come trovare nella funzione set. – Devsainii

0

Forse sono fuori luogo qui e non capisco l'OP ma perché ti unisci ai tavoli?

Se si dispone di una tabella con membri e questa tabella ha una colonna denominata "id_gruppo", è sufficiente eseguire una query sulla tabella dei membri per ottenere un conteggio dei membri raggruppati da id_gruppo.

SELECT group_id, COUNT(*) as membercount 
FROM members 
GROUP BY group_id 
HAVING membercount > 4 

Questo dovrebbe avere il minimo sovraccarico, semplicemente perché si sta evitando un join, ma deve ancora dare quello che volevi.

Se si desidera visualizzare i dettagli del gruppo e la descrizione, quindi aggiungere un join dalla tabella dei membri alla tabella dei gruppi per recuperare il nome, si otterrebbe il risultato più rapido.

Problemi correlati