繁体   English   中英

MySQL:从 UNION 中排除记录

[英]MySQL : exclude record from UNION

我有一个自动完成字段,它查询一个简单的表以匹配“包含字符串的名称”。

我担心的是我想首先列出完全匹配。

我执行这样的 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 (vs UNION ALL) 的目标,但事实并非如此,当然是因为 'type' 值。

或者也许有更好的解决方案来首先列出完全匹配?

您可以简单地在第二个查询中添加一个 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%'

您可以使用简单查询而不使用UNION / UNION ALL和两个查询。 您可以在ORDER BY上使用CASE WHEN通过 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 上的演示

在您的特定情况下,您可以使用

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM