[英]MySQL with union/join and two alias on same column
当我想将group_status 1和2的数量分开时,我在获取数量值时遇到问题。是否使用Alias和Union设置数量,它仅显示第一个查询。 Fyi,我确实尝试过使用双左联接并将表设置为'a'和'b',但它也无法正常工作。 欢迎任何帮助或解决方案。 谢谢!
下面是表格和我需要的查询结果。
$ a //开始日期$ 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 |
------------ -------------- ------------- ------------- -------------
使用UNION
和UNION 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
如果您还想为requesters
没有任何相关行的items
返回行(使用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
跟进
注意:连接谓词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
第二个查询返回四行(包括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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.