下面是一个网友教的 自己测过了 肯定有用
简要功能描述
数据库中推荐的文章按顺序排,其它的文章按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
自己亲自做的测试结果如下 但是结果不理想 它是把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