Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 按列列出的SQL计数出现次数_Mysql_Sql_Count_Sql Like - Fatal编程技术网

Mysql 按列列出的SQL计数出现次数

Mysql 按列列出的SQL计数出现次数,mysql,sql,count,sql-like,Mysql,Sql,Count,Sql Like,经过一些研究,我还没有找到我需要的,我想我会在这里问。我目前正在尝试开发一个应用程序的高级搜索模式,我的任务被卡住了。也许你能帮我。假设我有下表: ID | Name | Surname 1 | John | Mim 2 | Johnny | Crazy 3 | Mike | Something 4 | Milk | Milk 5 | Peter | IDontknow 6 | Mitch | SomeName 然后在我的前端,有一个输入字段。该字

经过一些研究,我还没有找到我需要的,我想我会在这里问。我目前正在尝试开发一个应用程序的高级搜索模式,我的任务被卡住了。也许你能帮我。假设我有下表:

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
有没有一种方法可以在一个查询中实现这一点

到目前为止我所尝试的:

实际上,我在数据库中的localhost上创建了上面的表,并尝试了不同的查询。尝试使用
选择count(姓名)、count(姓氏)
,但这两个计数都将输出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

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对表进行双重扫描:

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%'

不包含
人员表的
联合[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 |

在线测试。

我的朋友,你是真正的英雄。