MySQL IN 条件语句 排序方法

有个场景,一个几万条记录的表,主键是 id,我想从表中取 id 为 30,20,80,40 的几条记录。

注意,30,20,80,40,是我预期的顺序,我希望 MySQL 按这样的顺序返回记录。

于是我这样写 SQL:

 代码如下 复制代码

SELECT * FROM my_table WHERE id IN (30, 20, 80, 40);

结果是,他没有按我给的顺序返回。

怎么办?

查到了 FIELD() 函数。

 代码如下 复制代码

FIELD(str,str1,str2,str3,…)
Returns the index (position) of str in the str1, str2, str3, … list. Returns 0 if str is not found.

把 SQL 语句改写为:

 代码如下 复制代码

SELECT * FROM my_table WHERE id IN (30, 20, 80, 40) ORDER BY FIELD(id, 30, 20, 80, 40);

排序过程是:

把选出的记录的 id 在 FIELD 列表中进行查找,并返回位置,以位置作为排序依据。

这样的用法,会导致 Using filesort,是效率很低的排序方式。除非数据变化频率很低,或者有长时间的缓存,否则不建议用这样的方式排序。

把 MySQL 返回的结果,用 PHP 在内存中按 id 顺序重新排列,是个不错的优化方案。

时间: 2024-10-10 13:32:55

MySQL IN 条件语句 排序方法的相关文章

mssql 与 mysql 中While语句使用方法

mssql 与 mysql教程 中while语句使用方法 while的使用水平能够有些帮助. while boolean_expression     { sql_statement | statement_block }     [ break ]     { sql_statement | statement_block }     [ continue ] 参数 boolean_expression 返回 true 或 false 的表达式.如果布尔表达式中含有 select 语句,必须用

解决mysql group by不能排序方法

常用的方法  代码如下 复制代码 select * from table group by column_name order by id desc  是不能得到每个分组里面的id的最大的值的 解决方法: 有人写出下面的语句:  代码如下 复制代码 SELECT *,max(dateline) as max_line FROM posts GROUP BY  tid ORDER BY dateline DESC LIMIT 10 这条语句的没错是选出了最大发布时间,但是你可以对比一下 datel

MySQL Where 条件语句介绍和运算符小结_Mysql

WHERE 条件 有时候操作数据库时,只操作一些有条件限制的数据,这时可以在SQL语句中添加WHERE子句来规定数据操作的条件. 语法: 复制代码 代码如下: SELECT column,- FROM tb_name WHERE definition WHERE 关键字后面接有效的表达式(definition),该表达式表示被操作的数据记录必须满足的条件. 除 SELECT 外,WHERE 条件关键字可以用于任何 SQL 语法允许的场合,如 UPDATE(更新).DELETE(删除)等. 例子:

mysql 关键词相关度排序方法详细示例分析_Mysql

小项目有时需要用到关键词搜索相关性排序,用sphinx显得杀鸡用牛刀,就用mysql的order by对付下.方法一: 复制代码 代码如下: select * from articles where (title LIKE '%keywords%') or (content LIKE '%helloworld%') order by ((CASE WHEN title LIKE '%keywords%' THEN 2 ELSE 0 END) + (CASE WHEN content LIKE '

net-用个EF框架的泛形类(BaseDal),按条件查询 的方法,排序的lambda表达式不知道写

问题描述 用个EF框架的泛形类(BaseDal),按条件查询 的方法,排序的lambda表达式不知道写 .net的mvc开发中,我用了一个EF框架的泛形类(BaseDal),我在里面写了一个按条件查询 的方法,但是那个排序的lambda表达式我不知道写 public static List<T> GetPageListBy<TKey>(int pageIndex, int pageSize, ref int rowCount, System.Linq.Expressions.Exp

MySQL中select语句使用order按行排序_Mysql

本文介绍MySQL数据库中执行select查询语句,并对查询的结果使用order by 子句进行排序. 再来回顾一下SQL语句中的select语句的语法: Select 语句的基本语法: Select <列的集合> from <表名> where <条件> order by <排序字段和方式> 如果要对查询结果按某个字段排序,则要使用order by 子句,如下: select * from <表名> order by <字段名称>

MySQL查询优化:连接查询排序limit(join、order by、limit语句)

MySQL查询优化:连接查询排序limit(join.order by.limit语句) 不知道有没有人碰到过这样恶心的问题:两张表连接查询并limit,SQL效率很高, 但是加上order by以后,语句的执行时间变的巨长,效率巨低. www.bitsCN.com 情况是这么一个情况:现在有两张表,team表和people表,每个people属于一个 team,people中有个字段team_id. 下面给出建表语句: [sql] create table t_team ( id int pr

主类-JAVA主语句中不能放循环或条件语句,那如何在其他方法中使用这个方法中定义的整型

问题描述 JAVA主语句中不能放循环或条件语句,那如何在其他方法中使用这个方法中定义的整型 public void tian(){ int k=0; } public void tian2(){ for(;k<5;k++){ break; } } 这样? 解决方案 不太明白楼主的意思 定义在方法内的变量是局部变量,其他方法是找不到的 不过你可以在调用方法的时候作为参数把这个变量的值传过去 解决方案二: 这什么问题-- 局部变量的作用域就在本域内,怎么作用在外部? 难道JAVA出新特性了? 解决方

数据库查询判断-vb2012 查询mysql数据库 where 条件语句有多个变量该怎么写?

问题描述 vb2012 查询mysql数据库 where 条件语句有多个变量该怎么写? 单个变量时 ("select * from biao1 where id>=" & i,conn) 没有问题 我想id取值在变量i和j之间,另外name=lk,求大神赐教! 解决方案 你会一个条件,多个条件,自己拼接字符串,总该会吧 解决方案二: 你可以使用string把字符串拼接起来. 或者用sprintf格式化写入一个字符串 #include<iostream> #in