两个LIKE条件,但从一个先检索另一个

时间:2013-04-16 03:17:18

标签: mysql sql

   SELECT *
   FROM address 
   WHERE name LIKE 'a%' OR name LIKE '% a%' LIMIT 10

此查询以name开头a检索以'a%'开头的'% a%'个 或者在中间LIKE 'a%'中的单词。如何从LIKE '% a%'首先检索结果 那么{{1}}?。

4 个答案:

答案 0 :(得分:3)

添加ORDER BY子句,

SELECT *
FROM address
WHERE name LIKE 'a%' OR name LIKE '% a%' 
ORDER BY CASE WHEN name LIKE 'a%' THEN 0 ELSE 1 END
LIMIT 10

答案 1 :(得分:0)

这是:

SELECT t1.*
FROM (
   SELECT *
   FROM address 
   WHERE name LIKE 'a%'
   LIMIT 10
) t1
WHERE t1.name LIKE '% a%' 

答案 2 :(得分:0)

一种方法是在查询中添加ORDER BY子句:

ORDER BY IF(name LIKE 'a%',1,2) 

这样的事情:

SELECT *
  FROM address 
 WHERE name LIKE 'a%' OR name LIKE '% a%'
 ORDER BY IF(name LIKE 'a%',1,2) 
 LIMIT 10

要避免在大型集合上使用“文件排序”操作(即地址中的行数很多),并且如果您只想返回10行,通过将行数限制为更复杂的查询可能会表现得更好分类:

SELECT c.* 
  FROM ( SELECT a.*
           FROM (
                  SELECT *
                    FROM address 
                   WHERE name LIKE 'a%'
                   LIMIT 10 
                ) a
          UNION ALL
         SELECT b.*
           FROM address b
          WHERE b.name LIKE '% a%' AND b.name NOT LIKE 'a%'
          LIMIT 10
       ) c
 ORDER BY c.name LIKE 'a%' DESC
 LIMIT 10

答案 3 :(得分:0)

联合查询可能在这里有序。每个MySQL文档

要使UNION结果中的行由每个SELECT一个接一个地检索的行组成,请在每个SELECT中选择一个附加列作为排序列,并在最后一个SELECT后添加ORDER BY: / p>

(SELECT 1 AS sort_col, col1a, col1b, ... FROM t1)
UNION
(SELECT 2, col2a, col2b, ... FROM t2) ORDER BY sort_col;

所以对于你的情况就像

(Select *, 1 as sortcol from addresses where name like 'a%')
 Union
 (Select *, 2 as sortcol from addresses where name like '% a%')
 Order by sortcol

链接:http://dev.mysql.com/doc/refman/5.0/en/union.html