Количество появлений SQL по столбцам - PullRequest
2 голосов
/ 09 июля 2019

После некоторых исследований я не нашел то, что мне нужно, и я подумал, что я спрошу здесь. В настоящее время я пытаюсь разработать расширенный режим поиска для приложения, и я застрял с моей задачей. Возможно ты можешь помочь мне. Итак, представьте, у меня есть следующая таблица:

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 для обоих подсчетов. Так что я даже не уверен, возможно ли это только в одном запросе.

Ответы [ 5 ]

1 голос
/ 09 июля 2019

Попробуйте это:

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%'
1 голос
/ 09 июля 2019

сделать настройку группы, используя случай, когда

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
1 голос
/ 09 июля 2019

использование 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%'
0 голосов
/ 09 июля 2019

Решение без UNION[ ALL] таблицы people:

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 .

0 голосов
/ 09 июля 2019

В 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
...