Mysql 我的两个SQL查询有问题
我有一个带有结构的表prod 身份证,姓名,关键字,出生年份 例如,需要将在字段yearborn中遇到的关键字分组数带入Mysql 我的两个SQL查询有问题,mysql,Mysql,我有一个带有结构的表prod 身份证,姓名,关键字,出生年份 例如,需要将在字段yearborn中遇到的关键字分组数带入 SELECT yearborn, COUNT(Id) cnt1 FROM prod WHERE keyword='admiral' GROUP BY yearborn 及 如何组合这两个查询以获得具有该结构的输出结果表 一岁出生,cnt1,cnt2 我试过联合 SELECT yearborn, COUNT(Id) cnt1 FROM prod WHERE keyword='
SELECT yearborn, COUNT(Id) cnt1 FROM prod WHERE keyword='admiral'
GROUP BY yearborn
及
如何组合这两个查询以获得具有该结构的输出结果表
一岁出生,cnt1,cnt2
我试过联合
SELECT yearborn, COUNT(Id) cnt1 FROM prod WHERE keyword='admiral' GROUP BY yearborn
UNION
SELECT yearborn, COUNT(Id) cnt2 FROM prod WHERE keyword='captain' GROUP BY yearborn
但结果是:
一岁出生,cnt1
请告诉我如何摆脱这种局面。怎么样:
SELECT yearborn, COUNT(Id) cnt1, NULL cnt2 FROM prod WHERE keyword='admiral' GROUP BY yearborn
UNION
SELECT yearborn, NULL cnt1, COUNT(Id) cnt2 FROM prod WHERE keyword='captain' GROUP BY yearborn
SELECT yearborn,SUM(cnt1),SUM(cnt2) FROM
(
SELECT yearborn, COUNT(id) cnt1, 0 cnt2 FROM prod WHERE keyword='admiral'
UNION ALL
SELECT yearborn, 0 cnt1, COUNT(id) cnt2 FROM prod WHERE keyword='captain'
)
GROUP BY yearborn
您可以在关键字条件上使用SUM(),因为MySQL中的比较结果可以被视为0(false)或1(true):
这还具有仅使用一次表扫描的优点(比使用联合和子查询更快)。您可以尝试以下方法:
SELECT `yearborn`,
COUNT(`Id`) AS `cnt1`
FROM `prod`
WHERE `keyword` IN ('admiral','captain')
GROUP BY `yearborn`,`keyword`;
编辑:
按语句在GROUP中添加了关键字
SELECT yearborn,
SUM(IF(keyword = 'admiral', 1, 0)) cnt1,
SUM(IF(keyword = 'captain', 1, 0)) cnt2
FROM prod
WHERE keyword = 'admiral'
OR keyword = 'captain'
GROUP BY yearborn
结果如下(当然这是虚构的数据):
SELECT `yearborn`,
COUNT(`Id`) AS `cnt1`
FROM `prod`
WHERE `keyword` IN ('admiral','captain')
GROUP BY `yearborn`,`keyword`;
SELECT yearborn,
SUM(IF(keyword = 'admiral', 1, 0)) cnt1,
SUM(IF(keyword = 'captain', 1, 0)) cnt2
FROM prod
WHERE keyword = 'admiral'
OR keyword = 'captain'
GROUP BY yearborn
+----------+------+------+
| yearborn | cnt1 | cnt2 |
+----------+------+------+
| 2004 | 1233 | 0 |
| 1999 | 0 | 15 |
+----------+------+------+