`

IN条件结果顺序问题

 
阅读更多

项目中需要记录用户的浏览历史,我的意见是前端直接存cookie里,可是前端说cookie内容太多,要求传递id,后端返回数据,结果就产生如下的问题。

1.据前端说,url中的数组传递是无序的(其实我纳闷,为什么)

2.传递到后端的id,使用SQL语句中的in条件,但是返回的顺序却是该id的增序,而不是前端传递的id顺序

在网上找到了解决办法,原文如下:

有个场景,一个几万条记录的表,主键是 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 顺序重新排列,是个不错的优化方案。

分享到:
评论

相关推荐

    Oracle数据库中ORDER BY排序和查询按IN条件的顺序输出

    本文将深入探讨`ORDER BY`子句在Oracle中的排序机制,以及查询时根据`IN`条件顺序输出的方法。 首先,`ORDER BY`用于指定查询结果的排序方式,可以基于一个或多个列进行升序(ASC)或降序(DESC)排序。然而,...

    详解 Mysql查询结果顺序按 in() 中ID 的顺序排列

    当我们结合`IN()`与`ORDER BY`子句时,特别是使用`FIELD()`函数,我们可以控制查询结果按照`IN()`列表中的顺序进行排序。`FIELD()`函数在MySQL中是一个特殊函数,它返回指定值在提供的列表中出现的位置,如果值不...

    【JavaScript源代码】详解JS对象遍历的顺序问题.docx

    然而,对象遍历的顺序问题经常让开发者感到困惑。本篇文章将详细解释JavaScript对象遍历的顺序规则,以及常用的几种遍历方法。 #### 对象遍历顺序的基本原则 在JavaScript中,遍历对象时的顺序并非完全随机,而是...

    SQL优化之针对count、表的连接顺序、条件顺序、in及exist的优化

    本文将深入探讨四个关键的SQL优化策略:count、表的连接顺序、条件顺序以及in和exist的使用。 首先,让我们关注`count()`函数的优化。通常认为`count(*)`统计所有行,而`count(列名)`只计算指定列的非空值。许多人...

    顺序统计量书籍Order Statistics in Wireless Communications

    例如,在信号检测问题中,通过比较接收到的信号与噪声的顺序统计量,可以提高信噪比估计的精度,从而改善接收机的性能。而在干扰分析中,顺序统计量可以帮助识别和量化多径衰落、频率选择性衰落等复杂无线环境下的...

    顺序表的插入和删除源码

    for i in range(顺序表.length, 位置): # 移动元素 顺序表.array[i] = 顺序表.array[i - 1] 顺序表.array[位置] = 元素 顺序表.length += 1 ``` 2. 删除操作:删除顺序表中的一个元素,同样涉及移动元素来填补...

    给定进栈顺序,判断一个序列是否为正确的出栈顺序

    在这个问题中,我们关注的是栈(Stack)这一数据结构,它遵循“后进先出”(Last In First Out,简称LIFO)的原则。栈的操作主要包括入栈(Push)和出栈(Pop)。当一个元素被入栈,它会被放在栈顶;而出栈时,总是...

    vs顺序结构if语句

    条件通常是一个表达式,其结果为布尔值(true或false)。如果条件为真,`{}`内的代码块将被执行;否则,如果存在else部分,那么else后的代码块会被执行。例如: ```csharp int score = 90; if (score >= 60) { ...

    MySQL查询in操作 查询结果按in集合顺序显示

    当使用`IN`操作符时,通常查询结果是根据表中的数据自然顺序返回的,而不是按照`IN`列表中的顺序。然而,如果你希望查询结果按照`IN`列表中的顺序排列,可以使用`ORDER BY`与`FIND_IN_SET`或`FIELD`函数结合来实现。...

    VHDL本性语句与顺序语句的理解

    条件语句是顺序语句的一种,用于根据不同的条件选择执行不同的分支。在VHDL中,常见的条件语句包括`if`语句、`case`语句等。 **`if`语句** `if`语句可以根据不同的条件执行不同的代码块。例如: ```vhdl if ...

    顺序栈的基本操作

    - 结果分析:通过测试案例展示顺序栈的正确运行,分析其空间和时间效率。 - 总结与讨论:可能遇到的问题、解决方法及进一步改进的空间。 通过以上内容,我们可以深入理解顺序栈的基本概念、数据结构以及如何在...

    PLC顺序功能图转化梯形图的精简编程解析.pdf

    本篇文档主要探讨了在西门子PLC环境下,如何通过顺序功能图(Sequential Function Chart,简称SFC)转化成梯形图的编程方法,并提出了采用移位寄存器思路和递增(INC)指令进行步进顺控编程的精简编程解析方法。...

    SQL查询原理及执行顺序

    - 使用`EXISTS`代替`IN`操作符可以显著加快子查询的执行速度,因为`EXISTS`只需找到第一个匹配项即可终止子查询,而`IN`则需遍历整个子查询结果集。 - 避免使用`HAVING`子句,尤其是在大结果集的情况下,因为`HAVING...

    数据结构顺序栈基于C++

    顺序栈是一种线性数据结构,它的元素按照先进后出(First In Last Out, FIFO)的原则进行存储和操作。在顺序栈中,元素存储在一块连续的内存区域,栈顶是元素添加和删除的位置。栈顶的操作包括压栈(Push)和弹栈...

    顺序栈的基本操作和实现

    顺序栈是一种常见的数据结构,它在内存中连续存储元素,具有简单易用、效率较高的特点。...在设计和实现顺序栈时,我们需要关注动态扩容、边界条件处理和效率优化等方面,以实现高效可靠的栈操作。

    栈的出栈顺序

    ### 栈的出栈顺序知识点解析 #### 一、栈的基本概念 栈是一种特殊的线性数据结构,只允许在一端进行插入和删除操作。这一端称为栈顶(top),另一端称为栈底(bottom)。栈按照后进先出(Last In First Out, LIFO...

    用顺序栈实现括号匹配检查

    这里我们关注的是使用顺序栈来解决这个问题。顺序栈是一种数据结构,它利用数组来存储元素,遵循后进先出(LIFO)的原则,非常适合处理这种配对问题。 首先,我们要理解括号匹配的基本概念。在编程语言中,常见的...

    mysql in 排序

    在MySQL数据库中,`IN`子句是一种非常实用的功能,主要用于在WHERE子句中指定一个条件值的列表。如果列的值匹配列表中的任何一个值,则会选取该行。然而,在某些情况下,我们不仅需要通过ID列表筛选数据,还需要确保...

Global site tag (gtag.js) - Google Analytics