获取与LIKE语句结合的唯一列

时间:2017-12-30 08:43:44

标签: mysql sql

我有表'place'的列:id(唯一),名字,邮政。名称可以重复。

我想执行查询以查找前20条记录,其中名称以某些needle开头,但没有重复的名称。这是为了ajax实时搜索。 关键是我需要将它与邮政相结合,因为我不想从不同地区切割地方。前两封邮件就足够了。

数据示例:

id name postal
1 Bradford BD83CB
2 Bradford BD74RT
3 Keighley BD215CT
4 Bradford CC763DD
5 Braster DD339CL

这里的针是“Bra%” 结果应该包含id为1和4以及5,因为ID为4的记录中的Bradford在ID为1和2的Bradford之外的其他区域中。

我尝试了什么:

SELECT id, `name`, postal FROM places WHERE `name` LIKE 'needle%' GROUP BY `name` LIMIT 20

但当然这还不够,因为这会削减所有names并且我不会有id为1,4,5的记录,但只有id为1.我应该在邮件中添加某个条件。< / p>

最后一件事是它应该尽可能快地进行ajax搜索。

如果找不到具有高性能的选项,我可以考虑添加可能值为0和1的列searchable,并在where语句中使用它。

2 个答案:

答案 0 :(得分:1)

这有效但我无法测试性能。

 DROP TABLE IF EXISTS T;
CREATE TABLE T (id INT,name VARCHAR(20), postal VARCHAR(10));
INSERT INTO T VALUES
(1, 'Bradford' ,'BD83CB'),
(2, 'Bradford' ,'BD74RT'),
(3, 'Keighley' ,'BD215CT'),
(4, 'Bradford' ,'CC763DD'),
(5, 'Braster' ,'DD339CL');


SELECT ID,NAME,POSTAL 
FROM T
WHERE ID = (SELECT MIN(ID) FROM T T1 WHERE T1.NAME = T.NAME AND LEFT(T1.POSTAL,2) = LEFT(T.POSTAL,2))
AND NAME LIKE 'BRA%'
;

结果

+------+----------+---------+
| ID   | NAME     | POSTAL  |
+------+----------+---------+
|    1 | Bradford | BD83CB  |
|    4 | Bradford | CC763DD |
|    5 | Braster  | DD339CL |
+------+----------+---------+
3 rows in set (0.00 sec)

答案 1 :(得分:1)

我认为这个更简单,性能更好。

SELECT id, `name`, postal, substring(postal, 1, 2) FROM places WHERE `name` LIKE 'Bra%' GROUP BY substring(postal, 1, 2);

此版本也在我的设置中运行(maridb 10.1.29)

SELECT id, `name`, postal FROM places WHERE `name` LIKE 'Bra%' GROUP BY substring(postal, 1, 2);

+------+----------+---------+ | id | name | postal | +------+----------+---------+ | 1 | Bradford | BD83CB | | 4 | Bradford | CC763DD | | 5 | Braster | DD339CL | +------+----------+---------+ 3 rows in set (0.00 sec)