2017-08-26 88 views
0

我嘗試在childs的記錄爲1的一對多關係child中進行選擇。對於用一個記錄獲取childs,我使用以下查詢。mysql group by with where返回其他結果

下面是一個簡單的查詢,如果我不使用where聲明

select a.iid, 
account_id, 
count(*) as props 

from accounts_prop a 
group by a.account_id 
having props = 1 

當我使用where我回來完全其他結果其中工程。在這種情況下,我得到記錄這表明道具爲1分的紀錄,但實際上有一個以上的

select a.iid, 
    account_id, 
    count(*) as props 

    from accounts_prop a 
    where a.von >= '2017-08-25' 
    group by a.account_id 

having props = 1 

我錯過了在這種情況下

+0

這兩個查詢是不同的第一個涉及所有行第二個只有行與a.von> ='2017-08-25'那麼你有不同的行組集..你的問題是不是清..試試解釋更好 – scaisEdge

回答

0

經仔細檢查什麼,你的原始查詢不確定性,甚至:

SELECT 
    a.iid,    -- OK, but which value of iid do we choose? 
    a.account_id, 
    COUNT(*) AS props 
FROM accounts_prop a 
GROUP BY a.account_id 
HAVING props = 1 

查詢是沒有意義的,因爲你選擇iid列,而在其他列聚集。 哪個值應該爲每個賬戶選擇iid?這並不明確,而且您的查詢甚至不會在某些版本的MySQL或大多數其他數據庫上運行。

相反,把你的邏輯來找到只有一個記錄賬戶爲子查詢,然後加入到該子查詢來獲得每場比賽的全部記錄:

SELECT a1.* 
FROM accounts_prop a1 
INNER JOIN 
(
    SELECT account_id 
    FROM accounts_prop 
    GROUP BY account_id 
    HAVING COUNT(*) = 1 
) a2 
    ON a1.account_id = a2.account_id 
WHERE a1.von >= '2017-08-25' 
+0

非常感謝詳細的解釋! – fefe

1

WHERE條件過濾器,你原來的行所以

where a.von >= '2017-08-25' 

減少參與查詢的行數

上查詢的結果having子句工作,讓你有一個地方過濾器(或無T)你獲得不同的結果
在您的計數在所有行計算的第一個查詢您的情況您的第二個查詢的數量僅在一個子集

計算這可以解釋爲什麼你獲得不同resul這兩個查詢