2013-01-15 18 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; 

Próbuję uzyskać wszystkich użytkowników i liczbę odwiedzin, które zrobili.mysql show Liczba wierszy z innej tabeli w każdym wierszu

Wynik, który otrzymuję, to wszyscy użytkownicy, ale kolumna zliczania zawiera tę samą wartość (nie dotyczy to konkretnego identyfikatora wiersza).

co ja tu robię źle? jak powiedzieć mysql użytkownikowi tego identyfikatora wiersza?

jest związkiem wybrać optymalny sposób to zrobić lub czy istnieje lepszy sposób?

+0

Spróbuj poniżej odpowiedzi, która ma wszystkie możliwości. – Sahal

Odpowiedz

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 

Można również użyć podselekcji oczywiście (na przykład, jeśli masz ANSIGROUP BY kompatybilność Włączone):

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

Dzięki, ale jeśli się nie mylę ... druga kwerenda również potrzebuje 'group by'. w przeciwnym razie da wiele rekordów z pierwszej tabeli. –

+0

@Dharmeshpatel: oba zapytania zwrócą te same zestawy wyników. – Quassnoi

+0

Robi to w moim przypadku .... w przeciwnym razie działa dla innych, a następnie ok. –

2

spróbować tej

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

który będzie działał z LEFT JOIN tabelach personal z 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 

Jeśli chcesz tylko użytkownikowi, które mają conajmniej licznik odwiedzin 1, zrobić RIGHT JOIN LUB HAVING w 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 

LUB

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

Spróbuj tego:

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

Nie spowoduje to zwrócenia osób z zerową liczbą odwiedzin. – Quassnoi

+0

@Quassnoi Przepraszamy, powinno to teraz zostać naprawione. Dzięki. –

Powiązane problemy