Home  >  Article  >  Database  >  IN条件结果顺序问题_MySQL

IN条件结果顺序问题_MySQL

WBOY
WBOYOriginal
2016-06-01 13:38:23998browse

bitsCN.com

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 顺序重新排列,是个不错的优化方案。
 

bitsCN.com
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn