2013-01-15 9 views
6
select `personal`.`id` AS `id`, 
`personal`.`name` AS `name`, 
(select count(visit.id) 
     from visit,personal 
     where visit.user_id=personal.id) as count 
from personal; 

im cercando di ottenere tutti gli utenti e il conteggio delle visite che hanno fatto.mysql show Numero di righe da un'altra tabella in ogni riga

il risultato che ottengo è tutti gli utenti ma la colonna conteggio contiene lo stesso valore (non specifico per l'ID di riga).

cosa sto facendo di sbagliato qui? come dire a mysql all'utente questo ID di riga?

è composto selezionare il modo ottimale per farlo o c'è un modo migliore?

+0

Prova qui sotto, che ha tutte le possibilità – Sahal

risposta

18
SELECT p.id, p.name, COUNT(v.user_id) 
FROM personal p 
LEFT JOIN 
     visit v 
ON  v.user_id = p.id 
GROUP BY 
     p.id 

Si può anche utilizzare subselect naturalmente (per esempio se si dispone di ANSIGROUP BY compatibilità su):

SELECT p.id, p.name, 
     (
     SELECT COUNT(*) 
     FROM visit v 
     WHERE v.user_id = p.id 
     ) 
FROM personal p 
+0

Grazie, ma se non sbaglio ... la seconda query richiede anche 'gruppo per'. altrimenti darà più record dalla prima tabella. –

+0

@Dharmeshpatel: entrambe le query restituiranno gli stessi risultati. – Quassnoi

+0

Lo fa nel mio caso ... altrimenti funziona per gli altri quindi ok. –

2

provare questo

SELECT 
Pe.id AS id,Pe.name AS name,COUNT(v.user_id) number_visit 
FROM personal Pe 
LEFT JOIN visit Vi 
    ON Vi.user_id= Pe.id 
GROUP BY Pe.id 
0

che funzionerà con LEFT JOIN tavoli personal con visit.

SELECT 
    Pe.id AS id, Pe.name AS name, COUNT(v.user_id) number_visit 
FROM 
    personal Pe 
LEFT JOIN 
    visit Vi ON Vi.user_id = Pe.id 
GROUP BY Pe.id 

Se desideri solo utente, che stanno avendo atleast conteggio visita 1, fare RIGHT JOIN O HAVING in Group By

SELECT 
    Pe.id AS id, Pe.name AS name, COUNT(v.user_id) number_visit 
FROM 
    personal Pe 
RIGHT JOIN 
    visit Vi ON Vi.user_id = Pe.id 
GROUP BY Pe.id 

O

SELECT 
    Pe.id AS id, Pe.name AS name, COUNT(v.user_id) number_visit 
FROM 
    personal Pe 
LEFT JOIN 
    visit Vi ON Vi.user_id = Pe.id 
GROUP BY Pe.id HAVING number_visit > 1 
1

Prova questo:

select 
    p.id AS `id`, 
    p.name AS `name`, 
    IFNULL(v.TheCount, 0) TheCount 
from personal p 
LEFT JOIN 
( 
    SELECT user_id, COUNT(*) TheCount 
    FROM visits v 
    GROUP BY user_id 
) v ON v.user_id = p.Id; 
+0

Questo non restituirà persone con zero visite. – Quassnoi

+0

@Quassnoi Spiacenti, dovrebbe essere risolto ora. Grazie. –

Problemi correlati