SQL 按列计算出现次数
SQL count occurrence by column
经过一些研究,我没有找到我需要的东西,我想我会在这里问。我目前正在尝试为应用程序开发高级搜索模式,但我一直在完成我的任务。也许你可以帮助我。所以想象一下我有以下 table:
ID | Name | Surname
1 | John | Mim
2 | Johnny | Crazy
3 | Mike | Something
4 | Milk | Milk
5 | Peter | IDontknow
6 | Mitch | SomeName
然后在我的前端,有一个输入字段。该字段的输入将以这种方式通过查询:
SELECT name, surname FROM people WHERE name LIKE 'input%' OR surname LIKE 'input%'
现在假设我的输入是 "Mi",所以我将在 "name" 列中匹配 3 列,在姓氏中匹配 2 列。这就是我要找的。
输出以下内容的计数:
Column | Count
Name | 3
Surname | 2
有没有办法只在一个查询中实现这一点?
到目前为止我尝试过的:
我实际上在我的数据库中的本地主机上创建了上面的 table 并尝试了不同的查询。尝试使用 SELECT count(name), count(surname)
,但这两个计数都会输出 3。所以我什至不确定这是否可能只在一个查询中实现。
使用union all
SELECT 'name' as col, count(name) as cnt FROM people WHERE name LIKE 'input%'
union all
SELECT 'surname', count(surname) FROM people WHERE surname LIKE 'input%'
使用 case when
自定义组
SELECT (case when name LIKE 'input%' then 'name'
else 'surname' end) as Column, count(*) as cnt
FROM people WHERE name LIKE 'input%' OR surname LIKE 'input%'
group by Column
在 Mysql 中,布尔值被评估为 1 或 0,因此您可以这样做:
select 'Name' Column, sum(name LIKE 'input%') Count from people
union all
select 'Surname', sum(surname LIKE 'input%') from people
对于 Mysql 8.0+,您可以使用 CTE 避免 table 的双重扫描:
with cte as (
select
sum(name LIKE 'input%') namecounter,
sum(surname LIKE 'input%') surnamecounter
from people
)
select 'Name' Column, namecounter Count from cte
union all
select 'Surname', surnamecounter from cte
试试这个:
SELECT "Name" as Column, count(*) as Count FROM people WHERE name LIKE 'mi%'
UNION
SELECT "Surname" as Column, count(*) as Count FROM people WHERE surname LIKE 'mi%'
people
table的UNION[ ALL]
的解决方案:
SELECT
CASE cj.x WHEN 1 THEN 'Name' ELSE 'Surname' END AS `Column`,
CASE cj.x
WHEN 1 THEN COUNT(CASE WHEN Name LIKE concat(@input, '%') THEN 1 end)
ELSE COUNT(CASE WHEN Surname LIKE concat(@input, '%') THEN 1 END)
END `Count`
FROM people CROSS JOIN (SELECT 1 AS x UNION ALL SELECT 2) AS cj
WHERE Name LIKE concat(@input, '%') OR Surname LIKE concat(@input, '%')
GROUP BY cj.x;
Mi
输入的输出:
| Column | Count |
+---------+-------+
| Name | 3 |
| Surname | 2 |
使用 SQL Fiddle 在线测试。
经过一些研究,我没有找到我需要的东西,我想我会在这里问。我目前正在尝试为应用程序开发高级搜索模式,但我一直在完成我的任务。也许你可以帮助我。所以想象一下我有以下 table:
ID | Name | Surname
1 | John | Mim
2 | Johnny | Crazy
3 | Mike | Something
4 | Milk | Milk
5 | Peter | IDontknow
6 | Mitch | SomeName
然后在我的前端,有一个输入字段。该字段的输入将以这种方式通过查询:
SELECT name, surname FROM people WHERE name LIKE 'input%' OR surname LIKE 'input%'
现在假设我的输入是 "Mi",所以我将在 "name" 列中匹配 3 列,在姓氏中匹配 2 列。这就是我要找的。
输出以下内容的计数:
Column | Count
Name | 3
Surname | 2
有没有办法只在一个查询中实现这一点?
到目前为止我尝试过的:
我实际上在我的数据库中的本地主机上创建了上面的 table 并尝试了不同的查询。尝试使用 SELECT count(name), count(surname)
,但这两个计数都会输出 3。所以我什至不确定这是否可能只在一个查询中实现。
使用union all
SELECT 'name' as col, count(name) as cnt FROM people WHERE name LIKE 'input%'
union all
SELECT 'surname', count(surname) FROM people WHERE surname LIKE 'input%'
使用 case when
自定义组SELECT (case when name LIKE 'input%' then 'name'
else 'surname' end) as Column, count(*) as cnt
FROM people WHERE name LIKE 'input%' OR surname LIKE 'input%'
group by Column
在 Mysql 中,布尔值被评估为 1 或 0,因此您可以这样做:
select 'Name' Column, sum(name LIKE 'input%') Count from people
union all
select 'Surname', sum(surname LIKE 'input%') from people
对于 Mysql 8.0+,您可以使用 CTE 避免 table 的双重扫描:
with cte as (
select
sum(name LIKE 'input%') namecounter,
sum(surname LIKE 'input%') surnamecounter
from people
)
select 'Name' Column, namecounter Count from cte
union all
select 'Surname', surnamecounter from cte
试试这个:
SELECT "Name" as Column, count(*) as Count FROM people WHERE name LIKE 'mi%'
UNION
SELECT "Surname" as Column, count(*) as Count FROM people WHERE surname LIKE 'mi%'
people
table的UNION[ ALL]
的解决方案:
SELECT
CASE cj.x WHEN 1 THEN 'Name' ELSE 'Surname' END AS `Column`,
CASE cj.x
WHEN 1 THEN COUNT(CASE WHEN Name LIKE concat(@input, '%') THEN 1 end)
ELSE COUNT(CASE WHEN Surname LIKE concat(@input, '%') THEN 1 END)
END `Count`
FROM people CROSS JOIN (SELECT 1 AS x UNION ALL SELECT 2) AS cj
WHERE Name LIKE concat(@input, '%') OR Surname LIKE concat(@input, '%')
GROUP BY cj.x;
Mi
输入的输出:
| Column | Count |
+---------+-------+
| Name | 3 |
| Surname | 2 |
使用 SQL Fiddle 在线测试。