2016-09-15 37 views
1

我在MySQL數據庫中的表2:獲取數和總數在mysql中加入2個表

1.

p_code{ 
    code varchar(10) primary key, 
    discount decimal(4,2) not null, 
    valid_till date not null, 
    daily int not null, 
    total int non null, 
    max_amount decimal (6, 2) not null 
} 

2.

p_user{ 
    code varchar(10) not null, 
    email varchar(50) not null, 
    date date not null, 
    primary key (code, email, date), 
    foreign key (code) references p_code(code) 
} 

現在我想對於總共使用email多少次,總共使用多少次email以及的細節。

我曾嘗試以下查詢:

SELECT pc.discount, pc.valid, pc.daily, pc.total, pc.max_amount, c.tcount, c.count 
FROM p_code AS pc 
LEFT JOIN (

    SELECT t.code, t.email, t.tcount, p.count 
    FROM (

    SELECT code, email, COUNT(email) AS tcount 
    FROM p_user 
    GROUP BY code, email 
    ) AS t 
    LEFT JOIN (

    SELECT code, email, COUNT(email) AS count 
    FROM p_user 
    WHERE `date` = CURDATE() 
    GROUP BY code, email 
    ) AS p ON (t.code, t.email) = (p.code, p.email) 

) AS c ON pc.code = c.code 
WHERE c.email = ? 
AND pc.code = ? 

但問題是,如果我沒有在表中p_usercodeemail中的任何條目,它不返回任何行。

我要求它應該返回p_code的所有列以及tcountcount列的0和0。

+0

當LEFT JOIN,出右側表的ON子句中的條件,以獲得真正的左聯接行爲。 (在WHERE中,你會得到經常的內部連接結果。) – jarlh

+0

@jarlh你是說我應該刪除'where c.email =?'?我要刪除它,我應該把它放在哪裏才能得到給定的'email'的結果? – Blip

+1

將'c.email =?'移動到'ON'子句,即'... AS c ON pc.code = c.code AND c.email =?在哪裏pc.code =?'。 – jarlh

回答

1

我想你可以simplifiy查詢這樣了,反正你需要把狀態左側連接的數據......在左連接。

SELECT 
    c.discount, 
    c.valid, 
    c.daily, 
    c.total, 
    c.max_amount, 
    count(u.email) as totalCount, 
    sum(case when u.`date` = CURDATE() then 1 else 0 end) as dailyCount 
FROM p_code c 
LEFT JOIN p_user u on u.code = c.code and u.email = ? 
WHERE c.code = ? 
GROUP BY c.discount, c.valid, c.daily, c.total, c.max_amount 

你也可以做,對電子郵件的「過濾器」:

WHERE c.code = ? and (u.email is null or u.email = ?) 
+0

這是一個可愛的解決方案。非常感謝。 – Blip

0

您需要使用IFNULL函數。

IFNULL(表達式1,表達式2)

如果expr1不是NULL,IFNULL()返回表達式1;否則返回 expr2。

您需要修改您的查詢,如:

SELECT pc.discount 
    , pc.valid 
    , pc.daily 
    , pc.total 
    , pc.max 
    , IFNULL(c.tcount, 0) AS tcount 
    , IFNULL(c.count, 0) as count 
FROM p_code AS pc 
... 
+0

我明白你在說什麼。但是如果在'p_user'中沒有輸入'email',我的查詢就不會返回任何行。所以,即使我用你的建議,我也不會得到期望的結果? – Blip

+0

我明白了。我以爲你正在獲取NULL值的行。 – KaeL