我有表'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语句中使用它。
答案 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)