【问题标题】:Arrange data in specific order按特定顺序排列数据
【发布时间】:2013-01-16 12:26:07
【问题描述】:

我有一个包含 8 条记录的用户表。我想根据字段id(即该表的主键)按降序排列数据,但id 3和5除外。所以最终结果应该是

id  name
--  ----
3   peter
5   david
8   john
7   stella
6   jim
4   jack
2   nancy
1   scott

除了 id 3 和 5 其余数据应按降序排列,3 和 5 应按升序排列。

【问题讨论】:

  • 这个问题也加1:D

标签: mysql sql


【解决方案1】:
SELECT * FROM user ORDER BY IF(id=3 OR id=5, id, ~id) ASC

【讨论】:

  • @a_horse_with_no_name: 执行查询 SELECT IF(id=3 OR id=5, id, ~id) FROM user 你会得到答案
  • 它给出了奇怪的数字。它们是什么?
  • 它们是临时自动生成的数字,无论处理表中的记录数。
  • SELECT * FROM table1 ORDER BY IF(id=3 OR id=5, id, id-8) desc非常相似,但是这里你需要将数字定义为最大id ;) ;
  • 没错。但我们不想为最大 id 烦恼。 :)
【解决方案2】:

类似这样的:

order by 
   case 
     when id = 3 then 999
     when id = 5 then 998
     else id
   end desc

这假设您确实没有超过 8 行。否则,您必须更改将 3 和 5 移到顶部的“魔术”数字。

【讨论】:

  • hmm.. 所以如果那个用户超过了,那么在这种情况下你的查询将不起作用?
  • @sureyn:您可以简单地将999 增加到一个非常大的值。
【解决方案3】:

我认为这里的技巧是使用枚举。

SELECT id, name FROM my_table WHERE id IN (3, 5) ORDER BY ASC
UNION
SELECT id, name FROM my_table WHERE id NOT IN(3, 5) ORDER BY DESC

【讨论】:

  • 不使用UNION还有其他方法吗?
  • 根据 SQL 标准,您不能订购 UNION 的一部分。 MySQL是否允许这样做?即使 MySQL 会尝试删除两个部分之间的重复项,订单是否会保留?
  • 我的错。我想我对标准做了假设。
【解决方案4】:

在 MySQL 中,有一个名为 FIELD 的函数*如果在列表中没有找到值,则返回零,例如,

SELECT *
FROM   tableName
ORDER BY FIELD(id, 5, 3) DESC, id DESC

【讨论】:

  • 但是返回的 id 像 3,5,1,2,4,6 等等......输出应该像 3,5,8,7,6,4.. ..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
相关资源
最近更新 更多