我在网上发现了以下问题:
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%'
顶部定义一个变量
然后在查询中使用它。
答案 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