如何根据一列对查询结果进行排序?

Posted

技术标签:

【中文标题】如何根据一列对查询结果进行排序?【英文标题】:How can I sort the result of a query based on the one column? 【发布时间】:2017-05-09 06:34:01 【问题描述】:

这是我的查询:

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('%', ?, '%') 条件放在第一位,然后其他结果应该在它们之后。我该怎么做?

【问题讨论】:

order by name LIKE CONCAT('%', ?, '%') desc, name asc @juergend 谢谢,你能告诉我你为什么把name asc写成order by的第二个参数吗? 不仅按第一个匹配项然后不匹配项进行排序,而且还按名称对这两个组进行排序。因此,所有匹配项都按名称排序,之后也是不匹配项。 @juergend 我明白了,太好了.. 看来您对 mysql 有很多经验.. 我的最后一个请求,您能看看下面由 Gordon 写的答案吗?告诉我他的观点是where,order by 他告诉你将where 子句的条件也放在order by 子句中,最后加上desc。基本上和我在评论中说的一样。 【参考方案1】:

您可以将where 条件添加到order by 子句:

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

MySQL 将数字上下文中的布尔表达式视为数字,“1”表示真,“0”表示假。因此,desc 排序。

请注意,usage_guidance 的第二个条件并不是回答问题所必需的。

【讨论】:

嗯?!老实说,您的查询对我来说不清楚.. WHERE 子句的另一部分呢? AND name NOT IN ($in) ?我不需要ORDER BY 子句吗? 嗯 MySQL 抛出一个语法错误.. 它说:你不能在 WHERE 子句中使用 desc @stack 。 . .那应该是order by 为什么避免在order by 子句中添加AND name NOT IN ($in) 条件(这是where 条件之一) @Shafizadeh。 . .问题是关于订购。该部分与订购无关。【参考方案2】:

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

您可以通过在IF() 语句中设置一个附加的选择字段 来实现这一点,该字段与nameWHERE 子句的条件相同,并按该字段排序:

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() 语句

【讨论】:

以上是关于如何根据一列对查询结果进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 使用冒泡排序根据第一列对二维数组的行进行排序

按一列对每个组进行排序,并根据每个组获取顶部元素

Druid -> 按本机查询的时间戳以外的另一列对数据进行排序

根据两个不同表上的两列对完全连接进行排序

EXT中如何按照某一列对数据库所有数据进行排序?默认的只能对当前页的数据进行升序降序排序!

按列对 csv 文件进行排序