MySQL: исключить запись из UNION - PullRequest
0 голосов
/ 03 марта 2020

У меня есть поле автозаполнения, которое запрашивает простую таблицу на соответствие «имя, содержащее строку».

Меня беспокоит то, что я хочу сначала указать точное совпадение.

Я выполняю UNION запрос, подобный следующему:

SELECT 'exact_match' AS type, name FROM table WHERE name='john'
UNION
SELECT 'match' AS type, name FROM table WHERE name LIKE '%john%'
ORDER BY type, name LIMIT 30

Но если пользователь вводит полное имя, результат содержит две записи (если в таблице нет других% john%):

john
john

Как я могу исключить результат одного из двух запросов, если они полностью совпадают?

Я думал, что это была цель UNION (против UNION ALL), но это не так, конечно, из-за типа ' 'value.

Или, может быть, есть лучшее решение, чтобы сначала перечислить точное совпадение?

Ответы [ 3 ]

2 голосов
/ 03 марта 2020

Вы можете просто добавить предложение where во второй запрос, чтобы исключить «идеальное совпадение», поскольку вы уже получили их в первом запросе:

SELECT 'exact_match' AS type, name FROM table WHERE name='john'
UNION
SELECT 'match' AS type, name FROM table WHERE name LIKE '%john%' AND name <> 'john'
ORDER BY type, name LIMIT 30

Или вы можете переписать свой запрос следующим образом:

SELECT
  CASE WHEN name = 'john' THEN 'exact_match' ELSE 'match' END AS type,
  name
FROM table
WHERE name like '%john%'
1 голос
/ 03 марта 2020

Вы можете использовать простой запрос без использования UNION / UNION ALL и двух запросов. Вы можете использовать CASE WHEN на ORDER BY для сортировки найденных имен по exakt match и match. С DISTINCT каждое имя отображается один раз.

SELECT DISTINCT name 
FROM table 
WHERE name LIKE '%john%'
ORDER BY CASE WHEN name = 'john' THEN 1 ELSE 2 END ASC, name ASC
LIMIT 30

демо на dbfiddle.uk

0 голосов
/ 03 марта 2020

в вашем конкретном случае вы можете использовать

SELECT MIN(type) type, name
FROM ( SELECT 'exact_match' AS type, name FROM table WHERE name='john'
       UNION
       SELECT 'match' AS type, name FROM table WHERE name LIKE '%john%' ) x
GROUP BY name
ORDER BY type, name LIMIT 30
...