2016-12-23 108 views
0

这里是我的查询:如何根据一列对查询结果进行排序?

SELECT name, usage_guidance, total_used_num 
FROM tags 
WHERE 
(name LIKE CONCAT('%', ?, '%') OR 
    usage_guidance LIKE CONCAT(?, '%')) AND 
name NOT IN ($in) 
LIMIT 6 

现在我想通过name列命令的结果。我的意思是我想提出的,因为在name LIKE CONCAT('%', ?, '%')条件匹配的结果,然后再等结果应该是在他们之后。我怎样才能做到这一点?

+1

'按名称排序LIKE CONCAT('%',?,'%')desc,name asc' –

+0

@juergend谢谢你,请问你为什么写'name asc'作为'order by'的第二个参数? – stack

+0

不仅按第一个匹配进行排序,然后不匹配,而是按名称对这两个组进行排序。所以所有的比赛都是按名字排序,然后是不匹配。 –

回答

0

你会在where条件添加到order by条款:

order by (name like CONCAT('%', ?, '%')) desc, 
     (usage_guidance LIKE CONCAT(?, '%')) desc 

MySQL的对待布尔表达式在数值上下文中为数字,以“1”为真,“0”为假。因此desc为了这种排序。

请注意,​​上的第二个条件对于回答问题并非严格必要。

+0

呵呵?老实说,你的查询对我来说还不清楚...... WHERE条款的其他部分呢? '和名称不在($ in)'中?我不需要'ORDER BY'子句吗? – stack

+0

那么MySQL会抛出一个语法错误..它说:你不能在'WHERE'子句中使用'desc'。 – stack

+0

@stack。 。 。这本应该是'排序'。 –

1

如果我正确理解您的问题,您需要先匹配显示name LIKE %SOMETHING%的结果。

你可以通过在IF()声明具有相同的条件为name和排序按该字段的WHERE条款设置额外的选择字段 实现这一目标:

SELECT name, usage_guidance, total_used_num, name LIKE CONCAT('%', ? , '%') as sort_field 
FROM tags 
WHERE 
(name LIKE CONCAT('%', ?, '%') OR 
    usage_guidance LIKE CONCAT(?, '%')) AND 
name NOT IN ($in) 
ORDER BY sort_field DESC 
LIMIT 6 

编辑:我只是意识到,你根本不需要IF()声明

相关问题