簡體   English   中英

SQL計數按列發生

[英]SQL count occurrence by column

經過一番研究,我沒有找到我需要的東西,我想我會在這里問。 我目前正在嘗試為應用程序開發高級搜索模式,而我的工作陷於困境。 也許你可以幫我。 因此,假設我有下表:

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”,因此在“名稱”列中將有3列匹配項,在姓氏中將有2列匹配項。 這就是我想要的。

計算結果如下:

Column  | Count
Name    | 3
Surname | 2

是否只有一種查詢可以實現此目的?

到目前為止,我已經嘗試過:
我實際上在數據庫的本地主機上創建了上面的表,並嘗試了不同的查詢。 嘗試使用SELECT count(name), count(surname) ,但是兩個計數都將輸出3。 因此,我什至不確定僅在一個查詢中是否可行。

union all使用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%'

在以下情況下使用案例進行自定義分組

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

嘗試這個:

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

在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

沒有people表的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在線進行測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM