当我想分离group_status 1和2的数量时,我在获取数量值时遇到问题。无论我使用Alias和Union设置数量,它都只显示第一个查询。仅供引用,我确实尝试使用双左连接并将表设置为“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 至 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
第二个查询返回四行(包括 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
关于MySQL 具有 union/join 和同一列上的两个别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36255312/