免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3104 | 回复: 9
打印 上一主题 下一主题

[求助]询问一个关于排序的mysql算法, 想了很久 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-03 10:31 |只看该作者 |倒序浏览
如题, 情况如下:
表结构
+----------------+---------------+-------------+
| id                  | order          |  title         |
+----------------+---------------+-------------+
| 1                  | 54                 |  abc         |
| 2                  | 35                 |  fff         |
| 3                  | 15                 |  eee         |
| 4                  | 20                 |  ddd         |
+-----------------|----------------|-------------|
其中id为key, order为uni.

想询问如何能用一条语句将id为1和2的表的order字段互换, 即变成
| 1                  | 35                 |  abc         |
| 2                  | 54                 |  fff         |

想了很久都没想出来, 试过REPLACE INTO, ON DUPLICATE KEY UPDATE, 都没办法. 实在没辙了~~
或者, 如果这根本是不可能的 , 那么我想做一个排序页面, 就是像下载软件优先级增减的那种按钮用来排序应该用什么方法?

论坛徽章:
0
2 [报告]
发表于 2008-11-03 14:03 |只看该作者
mysql> create table tt (id varchar(5),ord decimal(10,0),title varchar(10)) ;
Query OK, 0 rows affected (1.09 sec)

mysql> insert into tt values ('1',54,'abc') ;
Query OK, 1 row affected (0.03 sec)

mysql> insert into tt values ('2',35,'ff') ;
Query OK, 1 row affected (0.01 sec)

mysql> insert into tt values ('3',15,'ee') ;
Query OK, 1 row affected (0.01 sec)

mysql> insert into tt values ('4',20,'eedd') ;
Query OK, 1 row affected (0.00 sec)

mysql>
mysql>
mysql>
mysql> select  * From tt order by id ;
+------+------+-------+
| id   | ord  | title |
+------+------+-------+
| 1    |   54 | abc   |
| 2    |   35 | ff    |
| 3    |   15 | ee    |
| 4    |   20 | eedd  |
+------+------+-------+
4 rows in set (0.04 sec)

select  (case when id='1' then '2' when id='2' then '1' else id end ) as id  ,ord,title From tt order by (case when id='1' then '2' when id='2' then '1' else id end )  ;
+------+------+-------+
| id   | ord  | title |
+------+------+-------+
| 1    |   35 | ff    |
| 2    |   54 | abc   |
| 3    |   15 | ee    |
| 4    |   20 | eedd  |
+------+------+-------+
4 rows in set (0.00 sec)




mysql>
mysql>
mysql> select (case when xx.id='1' then '2' when xx.id='2' then '1' else xx.id end ) as id ,xx.ord,t.title
    -> From
    -> tt  xx, (select (case when  id='1' then '2' when  id='2' then '1' else  id end ) as id , ord, title From tt ) t
    -> where xx.id=t.id order by (case when xx.id='1' then '2' when xx.id='2' then '1' else xx.id end );
+------+------+-------+
| id   | ord  | title |
+------+------+-------+
| 1    |   35 | abc   |
| 2    |   54 | ff    |
| 3    |   15 | ee    |
| 4    |   20 | eedd  |
+------+------+-------+
4 rows in set (0.00 sec)




后面那个 SQL 就能完全满足你的要求。。你试试 ?


不过你的要求有些奇怪.。。 呵呵。

论坛徽章:
0
3 [报告]
发表于 2008-11-03 14:43 |只看该作者
楼上的解答得漂亮啊。

论坛徽章:
0
4 [报告]
发表于 2008-11-03 15:26 |只看该作者
经典 哈哈

论坛徽章:
0
5 [报告]
发表于 2008-11-03 19:27 |只看该作者
原帖由 jb96_xlwang 于 2008-11-3 14:03 发表
mysql> create table tt (id varchar(5),ord decimal(10,0),title varchar(10)) ;
Query OK, 0 rows affected (1.09 sec)

mysql> insert into tt values ('1',54,'abc') ;
Query OK, 1 row affected (0.03 ...

回二楼, 还从来没接触过sql的case呢, 这就去试试, 谢谢

论坛徽章:
0
6 [报告]
发表于 2008-11-03 19:31 |只看该作者
原帖由 aoswg 于 2008-11-3 19:27 发表

回二楼, 还从来没接触过sql的case呢, 这就去试试, 谢谢

仔细看了一下, 似乎误会我的意思了 我是要把表的内容改成这样 不是要取出这样的结果, 我的想法是最后取的时候.......order by `order`就好了
不过这个倒是提供了一个好的思路 实在不行可以insert into sth 然后后面接那个select语句....

THX```

论坛徽章:
0
7 [报告]
发表于 2008-11-03 22:20 |只看该作者
原帖由 aoswg 于 2008-11-3 19:31 发表

仔细看了一下, 似乎误会我的意思了 我是要把表的内容改成这样 不是要取出这样的结果, 我的想法是最后取的时候.......order by `order`就好了
不过这个倒是提供了一个好的思路 实在不行可以insert into sth ...



哦,要变成这样的结果啊,
这样:

mysql> select * From tt ;
+------+------+-------+
| id   | ord  | title |
+------+------+-------+
| 1    |   54 | abc   |
| 2    |   35 | ff    |
| 3    |   15 | ee    |
| 4    |   20 | eedd  |
+------+------+-------+
4 rows in set (0.00 sec)


mysql> update tt A set ord=(select ord From (
    ->                  select  (case when id='1' then '2' when id='2' then '1' else id end ) as id  ,ord,title From tt ) B
    ->    where A.id=B.id )
    -> where A.id in (1,2) ;
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0


mysql> select * From tt ;
+------+------+-------+
| id   | ord  | title |
+------+------+-------+
| 1    |   35 | abc   |
| 2    |   54 | ff    |
| 3    |   15 | ee    |
| 4    |   20 | eedd  |
+------+------+-------+
4 rows in set (0.00 sec)

应该满足你的要求了。。

论坛徽章:
0
8 [报告]
发表于 2008-11-05 22:32 |只看该作者
果然是牛人,全部放在一条SQL解决了这个问题,以前做这样的东西,都得好几条SQL咧。

论坛徽章:
0
9 [报告]
发表于 2008-11-06 18:37 |只看该作者
,
共同进步哈。。

论坛徽章:
0
10 [报告]
发表于 2008-11-06 19:10 |只看该作者
sql 很强
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP