ORDER BY相关性,同时使用参数化值

时间:2011-10-02 10:42:49

标签: mysql sql-order-by

我在网上发现了以下问题:

SELECT company_title
  FROM companies 
 WHERE company_title like '%gge%'
 GROUP BY company_title 
 ORDER BY CASE WHEN company_title like 'gge%' THEN 0 
               WHEN company_title like '% %gge% %' THEN 1 
               WHEN company_title like '%gge' THEN 2 
               ELSE 3 
          END, company_title 
          limit 100

完美无缺。 问题是,我将参数作为值传递,然后失败。 所以问题是,如何将此查询与参数化值一起使用?

mysql程序员的一个例子可能是在SET @what = '%gge%'顶部定义一个变量 然后在查询中使用它。

2 个答案:

答案 0 :(得分:0)

您不能在order by子句中使用变量。

您必须使用动态SQL,请检查:http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html

答案 1 :(得分:0)

case when语句移动到选择部分,并通过别名引用order by子句。

SELECT company_title
       ,CASE WHEN company_title like CONCAT(@param,'%') THEN 0 
             WHEN company_title like CONCAT('% %',@param,'% %') THEN 1 
             WHEN company_title like CONCAT('%',@param) THEN 2 
             ELSE 3 
        END as relevance
  FROM companies 
 CROSS JOIN (SELECT @param:= ?) as trick_to_set_at_param_in_one_go
 WHERE company_title like CONCAT('%',@param,'%')
 GROUP BY company_title 
 ORDER BY relevance, company_title 
 LIMIT 100