我有一个用于内部搜索引擎的查询,该查询实际上很长(大约3英寸或更多)。
我怎样才能改进/优化/“快点”它,因为我需要做两个查询的“联合”?
SELECT id, name, rank, 1 as SortKey FROM MyTable WHERE name LIKE 'test'
UNION SELECT id, name, rank, 2 as SortKey FROM MyTable WHERE name LIKE '%test%'
ORDER BY CASE WHEN SortKey > 0 THEN 0
WHEN rank > 0 THEN 1
WHEN rank = 0 THEN 2
ELSE 3 END,
SortKey ASC, rank ASC LIMIT 0,12
另外,我必须在 MyTable (约250K行)中进行2次搜索。
1-我在名称列中搜索确切的术语:' test '。这应该是整个查询结果中的第一个结果。
2-然后,我在名称列中搜索更大的术语“%test%”,而没有第一个查询的结果。
即。 :
Mytable
id name rank
1 Robert 3
2 Roberta 5
3 Mark 8
4 Sophia 12
5 Robertina 1
1-我搜索' Robert ':
Mytable
id name rank
1 Robert 3
UNION 2-我搜索'% Robert %':
Mytable
id name rank
1 Robert 3
2 Roberta 5
5 Robertina 1
最终结果:
Mytable
id name rank
1 Robert 3
5 Robertina 1
2 Roberta 5
谢谢!
答案 0 :(得分:0)
如果我正确理解您的问题,则无需union
结果。您可以使用条件排序完成相同的结果:
SELECT id, name, rank
FROM MyTable
WHERE name LIKE '%test%'
ORDER BY CASE WHEN name = 'test' THEN 0 ELSE 1 END, rank ASC
LIMIT 0,12
MySQL 5.6架构设置:
create table Mytable (id int, name varchar(100), rank int);
insert into Mytable values
(1, 'Robert', 3),
(2, 'Roberta', 5),
(3, 'Mark', 8),
(4, 'Sophia', 12),
(5, 'Robertina', 1);
<强>查询强>:
SELECT id, name, rank
FROM MyTable
WHERE name LIKE '%Robert%'
ORDER BY CASE WHEN name = 'Robert' THEN 0 ELSE 1 END, rank ASC
LIMIT 0,12
<强>结果:
| id | name | rank |
|----|-----------|------|
| 1 | Robert | 3 |
| 5 | Robertina | 1 |
| 2 | Roberta | 5 |