2014-09-26 53 views
0

的我有表名訂單:代用相關查詢

 
id id_o value date 
1 1  400 2014-09-30 
2 1  300 2014-09-30 
3 1  200 2014-09-30 
4 2  100 2014-09-30 
5 2  200 2014-09-30 
6 3  50 2014-09-29 
7 3  100 2014-09-29 
8 4  300 2014-09-29 
9 5  600 2014-09-28 

我需要選擇由輸出ID_o用總和(值)分組的每一個順序< 700並從該選擇的表,我需要通過分組數據的顯示數據。 我使用了多個選擇:

select date, sum(mno) as mn 
from (
    select date,sum(value) as 'mno' 
    from orders 
    group by id_o 
    having sum(value)<700 
) table_alias 
group by date 

這是結果:

 
date   mn 
2014-09-30  300 
2014-09-29  450 
2014-09-28  600 

是否有可能替代或簡化此相關的查詢?

+3

你的查詢是好的(列別名周圍的單引號除外)。你的術語是錯誤的。這不是一個相關的子查詢。 – 2014-09-26 11:29:46

+1

請注意,您的子查詢會選擇日期,但會分組id_o。 MySQL允許這樣做 - 但它有點奇怪! – Strawberry 2014-09-26 11:37:34

+0

好吧,所以這是不相關的查詢,但多選。有什麼辦法可以用更簡單的東西來替代這個多重選擇,例如簡單的查詢?或者在數據庫加載方面可以嗎? – user3752452 2014-09-26 21:00:17

回答

1

您的內部查詢無效。它由id_o分組,但由date選擇。爲了解決這個問題,在內部查詢分組中添加一個額外的列(假設每個id_o的日期總是相同的)。您可以通過啓用sql_modeONLY_FULL_GROUP_BY來啓用強大的檢查。完整示例SQL fiddle

SELECT 
    date, 
    SUM(mno) AS mn 
FROM (
    SELECT 
     id_o, 
     date, 
     SUM(value) AS mno 
    FROM orders 
    GROUP BY 
     id_o, 
     date 
    HAVING 
     SUM(value) < 700 
) totalPerOrder 
GROUP BY date 

MySQL允許這種類型的查詢,但這樣做並不常見。請看下面的數據:

 
id id_o value date 
1 1  400 2014-09-29 
2 1  300 2014-09-30 
3 1  200 2014-09-30 

什麼date(S)將SELECT date, SUM(value) FROM orders GROUP BY id_o返回?它可能是第一個,最後一個,平均,最常見的一個,但更好地明確。任何其他DBMS都不會讓您執行此查詢。

除此之外,我會重新命名一些列以便更具表現力。 mn,mn_oid_o就是這樣的例子。另外value沒有任何描述,任何東西都可以是一個值。即使date字段本來可以稱爲value。查詢本身看起來很好(儘管可能缺少索引,但請注意)。

+0

爲什麼內部選擇無效?但它的工作。列id_o在下一個處理中並不重要,它僅在「group by」子句中使用。你爲什麼用id_o使用多個組,日期?我嘗試過,但結果與「group by id_o」相同。有什麼辦法可以用更簡單的東西來替代這個多選?我讀了類似的多重選擇非常加載數據庫服務器。 – user3752452 2014-09-26 20:50:40

+0

我在回答中添加了一個示例,我希望它可以幫助,但如果沒有,請告訴我。 – Caramiriel 2014-09-27 15:43:37