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

即時通訊嘗試獲取所有用戶和訪問次數。mysql show每行中其他表的行數

我得到的結果是所有用戶,但count列包含相同的值(不是特定於該行ID)。

我在這裏做錯了什麼?如何告訴mysql用戶這行ID?

是複合選擇最佳的方式來做到這一點或有沒有更好的方法?

+0

請嘗試下面的答案,這有所有的可能性 – Sahal

回答

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 

您也可以使用過程中的子查詢(例如,如果您有ANSIGROUP BY兼容性):

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

謝謝,但如果我沒有錯......第二個查詢也需要'group by'。否則它會從第一個表中給出多個記錄。 –

+0

@Dharmeshpatel:這兩個查詢都會返回相同的結果集。 – Quassnoi

+0

它在我的情況下....否則它適用於其他人,然後確定。 –

2

試試這個

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

將與LEFT JOINpersonal一起工作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 

如果你想只有那些有ATLEAST訪問數1用戶,請RIGHT JOINHAVINGGroup 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 

OR

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

試試這個:

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

這不會返回零訪問人員。 – Quassnoi

+0

@Quassnoi對不起,現在應該修復。謝謝。 –

相關問題