2016-11-04 33 views
3

我有3個表:名稱,註冊和更新。我正在使用LEFT JOIN通過一個公共ID加入3個表格。使用多個JOIN時Mysql返回不正確的COUNT?

我需要統計每個用戶的註冊數量,以及更新次數。我試過在GROUP BY字段中使用不同的選項,但似乎沒有任何工作。

這裏的SELECT語句:

SELECT 
    names.name_id AS 'Names ID' 
    ,names.name AS Name 
    ,count(registrations.date) AS Registrations 
    ,count(renewals.date) AS Renewals 

FROM names 

LEFT JOIN registrations 

    ON names.name_id = registrations.name_id 

LEFT JOIN renewals 

    ON renewals.name_id = registrations.name_id 

GROUP BY names.name_id, registrations.name_id, renewals.name_id; 

而且這裏有3個表:

TABLE: names 
    +---------+------+ 
    | name_id | name | 
    +---------+------+ 
    |  1 | Ana | 
    |  2 | John | 
    |  3 | Paul | 
    +---------+------+ 

    TABLE: registrations 
    +-----------------+---------+---------------------+-------+ 
    | registration_id | name_id | date    | value | 
    +-----------------+---------+---------------------+-------+ 
    |    1 |  1 | 2014-01-30 13:15:02 | 15 | 
    |    2 |  2 | 2014-05-01 18:01:44 | 15 | 
    |    3 |  2 | 2014-07-08 15:10:43 | 20 | 
    |    4 |  3 | 2012-09-28 17:45:32 | 15 | 
    |    5 |  3 | 2014-01-09 18:26:14 | 20 | 
    |    6 |  3 | 2015-01-10 13:22:01 | 25 | 
    +-----------------+---------+---------------------+-------+ 

    TABLE: renewals 
    +------------+---------+---------------------+-------+ 
    | renewal_id | name_id | date    | value | 
    +------------+---------+---------------------+-------+ 
    |   1 |  1 | 2015-01-30 00:00:00 | 5  | 
    |   2 |  1 | 2016-02-12 00:00:00 | 5  | 
    |   3 |  1 | 2015-06-01 00:00:00 | 5  | 
    |   4 |  1 | 2013-11-24 00:00:00 | 5  | 
    |   5 |  2 | 2015-01-27 00:00:00 | 5  | 
    +------------+---------+---------------------+-------+ 

這裏是不正確的結果我得到:

+----------+------+---------------+----------+ 
    | Names ID | Name | Registrations | Renewals | 
    +----------+------+---------------+----------+ 
    |  1 | Ana |    4 |  4 | 
    |  2 | John |    2 |  2 | 
    |  3 | Paul |    3 |  0 | 
    +----------+------+---------------+----------+ 

正確的結果我期待會是:

+----------+------+---------------+----------+ 
    | Names ID | Name | Registrations | Renewals | 
    +----------+------+---------------+----------+ 
    |  1 | Ana |    1 |  4 | 
    |  2 | John |    2 |  1 | 
    |  3 | Paul |    3 |  0 | 
    +----------+------+---------------+----------+ 

如何解決查詢以獲得正確結果?

+0

使用'count(distinct ...)'可能適合你。這將假設你的日期是「唯一的」每註冊/續訂等。因爲你有時間解決了第二它可能是好的。在其他問題中,它可能無法如此乾淨地工作。通用修補程序是爲每個表單獨生成計數,然後加入這些結果。 – shawnt00

+0

這樣做的工作。謝謝。 – noahstime

回答

0

您的查詢執行得很好。

第一次加入後,您有1條Ana,2條約翰和3條保羅。

在秒連接之後,Ana的一個條目被重複4次並且與4個續訂一起連接(連接)。如果你現在計算Ana的註冊日期,你會得到4.這就是你的「錯誤」來自哪裏。

你可以例如計算distinct日期來修復它。

+2

添加DISTINCT完成了這項工作。謝謝。 – noahstime

2

試試這個:

SELECT 
    names.name_id AS 'Names ID' 
    ,names.name AS Name 
    ,count(distinct registrations.registration_id) AS Registrations 
    ,count(distinct renewals.renewal_id) AS Renewals 
FROM names  
LEFT JOIN registrations  
    ON names.name_id = registrations.name_id  
LEFT JOIN renewals  
    ON renewals.name_id = registrations.name_id  
GROUP BY names.name_id, registrations.name_id, renewals.name_id; 

每當我遇到這類問題,我覺得它有助於只運行一個select *查詢,如果您的服務器可以把它。像這樣:

SELECT * 
FROM names  
LEFT JOIN registrations  
    ON names.name_id = registrations.name_id  
LEFT JOIN renewals  
    ON renewals.name_id = registrations.name_id ; 

這會讓你看到你真的在計算什麼。

+0

優秀!有效。非常感謝你。 – noahstime

+0

@noahstime,太好了。如果它適合你,請「接受」我的答案。 – CGritton