2016-03-28 42 views
0

我想在分離group_status 1和2的數量時獲取數量值時出現問題。是否使用Alias和Union設置數量只顯示第一個查詢。 Fyi,我嘗試過使用雙左連接,並將表設置爲'a'和'b',但它也不起作用。歡迎任何幫助或解決方案。謝謝!具有union/join和同一列上的兩個別名的MySQL

下面是我需要的表格和查詢結果。

$一個//開始日期 $ B //結束日期

查詢:

"SELECT items.item_name, requesters.item_version, requesters.quantity AS 'approved' 
      FROM requesters 
      JOIN items ON items.item_id=requesters.item_id 
      WHERE requesters.requested_date >= '$a' AND requesters.requested_date <='$b' 
      AND group_status =1 
UNION ALL 

SELECT items.item_name, requesters.item_version, requesters.quantity AS notapproved 
      FROM requesters 
      JOIN items ON items.item_id=requesters.item_id 
      WHERE requesters.requested_date >= '$a' AND requesters.requested_date <='$b' 
      AND group_status =2"; 

請求者:

------ --------- ------------- --------------- ------------- ------------- 
| id | item_id| item_version| requested_date|  quantity| group_status| 
------ --------- ------------- --------------- ------------- ------------- 
| 1 | 2  |  2013 | 2016-01-01 |   100 |   1 | 
| 2 | 2  |  2013 | 2016-01-12 |   200 |   2 | 
| 3 | 3  |  2007 | 2016-02-04 |   300 |   2 | 
| 4 | 3  |  2010 | 2016-03-25 |   400 |   1 | 
------ -------- ------------- --------------- ------------- ------------- 

項目:

------ -------- ------------- 
| id | item_id| item_name| 
------ -------- ------------- 
| 1 | 1 | Ms Office| 
| 1 | 2 | Ms Visio Pro|  
| 2 | 3 | Ms Visio Std|   
------ -------- ------------- 

狀態:

------ ---------- ------------- 
| id | status_id| status_name| 
------ ---------- ------------- 
| 1 |  1 | Approved |  
| 2 |  2 | Not Approved|   
------ ---------- ------------- 

查詢結果的實施例:

日期:2016-01-01 to 2016-01-31

------------- -------------- ------------- ------------- ------------- 
| item_name | item_version| Approved | Not Approved|  Total| 
------------- -------------- ------------- ------------- ------------- 
| Ms Visio Pro|   2013 |   100 |   200 |   300 | 
| Ms Visio Std|   2007 |   0 |   300 |   300 | 
| Ms Visio Std|   2010 |   400 |   0 |   400 | 
------------ -------------- ------------- ------------- ------------- 
+0

請修復這個問題的標籤。它不應該有PHP標籤。 – ryantxr

回答

1

隨着UNIONUNION ALL集合運算符,結果集的列名在第一個SELECT中指定。子查詢中的列名和別名被忽略。 (無法爲結果集中的一列指定兩個不同的別名,每列都指定一個名稱。)

但是對於您的結果,您不一定需要UNION ALL操作。

它看起來像你想在同一行上的每個狀態的數量SUM。您可以使用條件聚合。例如:

SELECT i.item_name 
    , r.item_version 
    , SUM(IF(r.group_status=1,r.quantity,0)) AS `Approved` 
    , SUM(IF(r.group_status=2,r.quantity,0)) AS `Not Approved` 
    , SUM(r.quantity)      AS `Total` 
    FROM requesters r 
    JOIN items i 
    ON i.item_id = r.item_id 
WHERE r.group_status IN (1,2) 
    AND r.requested_date >= ? 
    AND r.requested_date <= ? 
GROUP 
    BY i.item_name 
    , r.item_version 

如果你也想返回行的items沒有任何相關行中requesters(與group_status 1或2),你可以使用一個外部聯接,並在移動的謂詞ON條款...例如:

SELECT i.item_name 
    , r.item_version 
    , IFNULL(SUM(IF(r.group_status=1,r.quantity,0)),0) AS `Approved` 
    , IFNULL(SUM(IF(r.group_status=2,r.quantity,0)),0) AS `Not Approved` 
    , IFNULL(SUM(r.quantity),0)      AS `Total` 
    FROM items i 
    LEFT 
    JOIN requesters r 
    ON r.item_id = i.item_id 
    AND r.group_status IN (1,2) 
    AND r.requested_date >= ? 
    AND r.requested_date <= ? 
GROUP 
    BY i.item_name 
    , r.item_version 

隨訪

NOT E:連接謂詞r.item_id = i.item_id遵循與原始OP查詢相同的模式。

示範:

create table requesters (id int, item_id int, item_version int 
    , requested_date date, quantity int, group_status int) 
; 
insert into requesters (id, item_id, item_version 
    , requested_date, quantity, group_status) values 
('1','2','2013','2016-01-01','100','1') 
,('2','2','2013','2016-01-12','200','2') 
,('3','3','2007','2016-02-04','300','2') 
,('4','3','2010','2016-03-25','400','1') 
; 
create table items (id int, item_id int, item_name varchar(12)) 
; 
insert into items (id, item_id, item_name) values 
('1','1','Ms Office') 
,('1','2','Ms Visio Pro') 
,('2','3','Ms Visio Std') 
; 

首先查詢返回三行:

item_name  item_version Approved Not Approved Total 
------------ ------------ -------- ------------ ------ 
Ms Visio Pro   2013  100   200  300 
Ms Visio Std   2007   0   300  300 
Ms Visio Std   2010  400    0  400 

二查詢返回四行(包括 「零」 行了MS OFFICE):

item_name  item_version Approved Not Approved Total 
------------ ------------ -------- ------------ ------ 
Ms Office   (NULL)   0    0  0 
Ms Visio Pro   2013  100   200  300 
Ms Visio Std   2007   0   300  300 
Ms Visio Std   2010  400    0  400 
+0

測試過的第一個查詢及其唯一顯示的item_name,其他返回爲空結果。 – festvender

+0

查詢返回我期望的結果。編輯的答案包括後續演示,結果來自兩個查詢。 [** SQLFiddle演示http://sqlfiddle.com/#!9/bf12eb/1**](http://sqlfiddle.com/#!9/bf12eb/1) – spencer7593

+0

謝謝!它的工作!我非常感謝你的幫助。 – festvender

相關問題