2012-06-19 26 views
1

這是我的查詢(我用普通表名替換了表名)。我試圖在兩個不同的查詢中完成一個工會,以便按日期對它們進行分組,以便將具有相似日期的結果作爲一行進行分組。mysql union和類似字段的組

嘗試執行時,我得到「每個派生表都必須具有自己的別名」錯誤。我輸錯了什麼?

我已經研究過這個,但找不到答案。每個選定的字段都有一個別名?或者是第一個SELECT中的問題?

SELECT SUM(val), id, dat, title FROM (

         SELECT table1.product_id as id, SUM(table1.qty) as val, DATE_FORMAT(table1.created, '%Y-%m-1') as dat, table2.title as title 
         FROM table1 
         LEFT JOIN table3 ON table1.event_id = table3.id 
         LEFT JOIN table2 ON table1.product_id = table2.id 
         WHERE table1.user_id = $user_id AND table3.active != 2 AND table3.temp = 0 AND table2.active != 2 

         GROUP BY dat 

         UNION ALL 

         SELECT table4.product_id as id, SUM(table4.qty) as val, DATE_FORMAT(table4.created, '%Y-%m-1') as dat, table2.title as title 
         FROM table4 
         LEFT JOIN table5 ON table4.festival_id = table5.id 
         LEFT JOIN table2 ON table4.product_id = table2.id 
         WHERE table4.user_id = $user_id AND table5.active != 2 AND table2.active != 2 

         GROUP BY dat 

        ) 
         GROUP BY id 
         ORDER BY dat ASC 

這裏就是我試圖做的事:

我原來的結果:

Array 
(
[0] => stdClass Object 
    (
     [id] => 1 
     [val] => 1 
     [dat] => 2012-05-1 
     [title] => Test Product 
    ) 

[1] => stdClass Object 
    (
     [id] => 1 
     [val] => 8 
     [dat] => 2012-06-1 
     [title] => Test Product 
    ) 

[2] => stdClass Object 
    (
     [id] => 2 
     [val] => 4 
     [dat] => 2012-06-1 
     [title] => Test Product 2 
    ) 

[3] => stdClass Object 
    (
     [id] => 3 
     [val] => 6 
     [dat] => 2012-06-1 
     [title] => Test Product 3 
    ) 

[4] => stdClass Object 
    (
     [id] => 1 
     [val] => 10 
     [dat] => 2012-05-1 
     [title] => Test Product 
    ) 

[5] => stdClass Object 
    (
     [id] => 1 
     [val] => 8 
     [dat] => 2012-06-1 
     [title] => Test Product 
    ) 

[6] => stdClass Object 
    (
     [id] => 2 
     [val] => 3 
     [dat] => 2012-06-1 
     [title] => Test Product 2 
    ) 

[7] => stdClass Object 
    (
     [id] => 3 
     [val] => 3 
     [dat] => 2012-06-1 
     [title] => Test Product 3 
    ) 

) 

所以,如果他們有類似的日期和編號,我需要那些只是一個結果。像這樣:

Array 
(
[0] => stdClass Object 
    (
     [id] => 1 
     [val] => 11 
     [dat] => 2012-05-1 
     [title] => Test Product 
    ) 

[1] => stdClass Object 
    (
     [id] => 1 
     [val] => 8 
     [dat] => 2012-06-1 
     [title] => Test Product 
    ) 

[2] => stdClass Object 
    (
     [id] => 2 
     [val] => 7 
     [dat] => 2012-06-1 
     [title] => Test Product 2 
    ) 

[3] => stdClass Object 
    (
     [id] => 3 
     [val] => 9 
     [dat] => 2012-06-1 
     [title] => Test Product 3 
    ) 

) 

請讓我知道你是否需要別的東西。提前致謝。

回答

1

試試這個:

SELECT SUM(val), id, dat, title FROM (

        SELECT table1.product_id as id, SUM(table1.qty) as val, DATE_FORMAT(table1.created, '%Y-%m-1') as dat, table2.title as title 
        FROM table1 
        LEFT JOIN table3 ON table1.event_id = table3.id 
        LEFT JOIN table2 ON table1.product_id = table2.id 
        WHERE table1.user_id = $user_id AND table3.active != 2 AND table3.temp = 0 AND table2.active != 2 

        GROUP BY dat 

        UNION ALL 

        SELECT table4.product_id as id, SUM(table4.qty) as val, DATE_FORMAT(table4.created, '%Y-%m-1') as dat, table2.title as title 
        FROM table4 
        LEFT JOIN table5 ON table4.festival_id = table5.id 
        LEFT JOIN table2 ON table4.product_id = table2.id 
        WHERE table4.user_id = $user_id AND table5.active != 2 AND table2.active != 2 

        GROUP BY dat 

       ) AS t 
        GROUP BY id, dat 
        ORDER BY dat ASC 

由於錯誤提示,每個視圖/派生表必須有一個別名..

編輯:這會給你具有獨特的ID/DAT對記錄。似乎這是你在做什麼。

+0

我在其他例子中已經看到AS t的功能是什麼? –

+0

它是您爲查詢中的每個表指定的別名(意爲一個名稱)。對於正確的表格,它有它自己的名稱,但對於派生表格,它沒有名稱。沒有名字就不可能指定表格。這是MySQL的標準行爲。在SQLite中不是這樣。看到這個鏈接的一些更多的信息.​​. http://stackoverflow.com/questions/9442119/what-does-t-refer-to-in-this-sql – nawfal

+0

結果現在沒有被分組在一起,如上所述。我如何重構我的查詢以按要求顯示? –