欢迎各位兄弟 发布技术文章

这里的技术是共享的

Mysql select in 按id排序实现方法 substring_index find_in_set 有大用 有大用


下面是一个网友教的 自已测过了 肯定有用

简要功能描述
数据库中推荐的文章按顺序排,其它的文章按id正序排
文章有 article表
有三个字段  id,title,recommond_ids
id,title就不用解释了 recommonds_ids是打开这个文章后的推荐的文章,
比如 在数据库中如下所示
article表 
id  title  recommon_ids
1   标题1  2,4,5
2   标题2  1,3,4
3   标题3  2,5
4   标题4  5,3
5   标题5  4,3
6   标题6  1
至于怎么把数据插入到 表中的,我就不说了,这不是我要讲的重点
我要讲的是 如果 打开id为4的页面 要求出现推荐的文章有五个,但是数据库中只有 5,3两个数据 所以我们把id为5,3的排在最前面,其它的可以任意排,我们的sql语句应该是这样
使用 
select id,title from article order by field(id,5,3) desc,id asc 
就可以了
得到的结果如下
id title 
 
3  标题3
5  标题5
1  标题1
2  标题2
4  标题4
6  标题6
7  标题7
 
假如 desc 和 asc 相同  全是 asc
select id,title from article order by field(id,5,3) asc,id asc
1  标题1
2  标题2
4  标题4
6  标题6
7  标题7
5  标题5
3  标题3
 
假如 desc 和 asc 相同  全是 desc
select id,title from article order by field(id,5,3) desc,id desc
3  标题3
5  标题5
7  标题7
6  标题6
4  标题4
2  标题2
1  标题1
 
 
用 FIND_IN_SET 也可以的 只是 '15,34,108,130,137,280' 的逗号之间不能有空格,否则排序不对
SELECT id,FIND_IN_SET(id,'15,34,108,130,137,280') 
FROM `product`
ORDER BY FIND_IN_SET(id ,'15,34,108,130,137,280') desc
 LIMIT 12
 
 
关于 FIND_IN_SET  的用法 见 /node/1463 /node/4060 /node/4058


自已做的测试结果如下    但是结果不理想 它是把id作为串来排的 如果有id为'345,156,263'的部分 如 45,56也会排在前面
select id,typeid,substring_index('345,156,263',id,1) from dede_archives order by substring_index('345,156,263',id,1) asc limit 0,5
//上面的 
asc 可以省掉  即如下
select id,typeid,substring_index('345,156,263',id,1) from dede_archives order by substring_index('345,156,263',id,1) limit 0,5




select id,typeid,substring_index('3,1,2',id,1) from dede_archives order by substring_index('3,1,2',id,1) asc limit 0,5
//上面的 
asc 可以省掉  即如下
select id,typeid,substring_index('3,1,2',id,1) from dede_archives order by substring_index('3,1,2',id,1) limit 0,5



关于 substring_index 的用法 详见 /node/1463



select * from a order by substring_index('3,1,2',id,1); 
试下这个good,ls正解。 
order by find_in_set(id,'3,1,5') 

谢谢,经测试order by substring_index和order by find_in_set都可以



有时候我们在后台选择了一系列的id,我们想安装填写id的顺序进行排序,那么就需要下面的order by方法,测试通过
 
表结构如下: 
mysql> select * from test; 
+----+-------+ 
| id | name | 
+----+-------+ 
| 1 | test1 | 
| 2 | test2 | 
| 3 | test3 | 
| 4 | test4 | 
| 5 | test5 | 
+----+-------+ 

执行以下SQL: 
mysql> select * from test where id in(3,1,5); 
+----+-------+ 
| id | name | 
+----+-------+ 
| 1 | test1 | 
| 3 | test3 | 
| 5 | test5 | 
+----+-------+ 
3 rows in set (0.00 sec) 

这个select在mysql中得结果会自动按照id升序排列, 
但是我想执行"select * from test where id in(3,1,5);"的结果按照in中得条件排序,即:3,1,5, 

想得到的结果如下: 
id name 
3 test3 
1 test1 
5 test5 

请问在这样的SQL在Mysql中怎么写? 
网上查到sqlserver中可以用order by charindex解决,但是没看到Mysql怎么解决??请高手帮忙,谢 

谢! 

select * from a order by substring_index('3,1,2',id,1); 

试下这个good,ls正解。 


order by find_in_set(id,'3,1,5')  desc  //这里要加 desc了

谢谢,经测试order by substring_index和order by find_in_set都可以

来自 http://www.jb51.net/article/34800.htm
唯物品评历史

关注"唯物品评历史",跟着泪痕春雨先生,读懂历史,看彻人生

打开隐藏二维码