【问题标题】:Mysql having trouble with difficult order byMysql 遇到订单困难的问题
【发布时间】:2013-07-30 13:39:08
【问题描述】:

我正在构建的查询/视图有问题。

表结构:

  • templateId (Int, Primary)
  • attributeName (Varchar, Primary)
  • x1(整数)
  • x2(整数)
  • 对齐方式(枚举[左、右])
  • 位置(枚举[顶部,底部])
  • 偏移量(整数)

我想创建一个按以下顺序显示结果的视图:

  • 第一次排序,按 templateId ASC。
  • 第二次排序,如果 Position=Top,则按 Offset ASC,否则如果 Position=Bottom,则按 Offset DESC。

我该如何创建它,尤其是考虑到第二次排序。

问候。

【问题讨论】:

  • 由于 templateID 是主键,所以它是唯一的。所以永远不会使用第二个排序。
  • @Barmar 主键是复合的(templateId, attributeName)
  • @Barmar (templateId, attributeName) 的组合为主键。
  • Top 元素和 Bottom 元素之间的顺序是什么?

标签: mysql


【解决方案1】:
ORDER BY templateid ASC, IF(Position = 'top', offset, -offset) ASC

【讨论】:

  • 怕这个不行。当您从顶部切换到底部时,顺序也会切换(从 ASC 到 DESC)。
  • 在这种特殊情况下可能不是问题,但更一般地说,如果offset 包含NULLvalues,我认为这不会像预期的那样运行。
  • 有一个减号可以使它起作用。你为什么不简单地测试它。同意 Null 值,但在初始描述中未提及
  • @NedretRecep 我做了测试。结果是我首先想要 Position='Top' 的那些,但忘了把它放在我的 OP 上。
  • 那么有第三个排序标准吗?我不明白
【解决方案2】:
ORDER BY templateId ASC,
    CASE Position WHEN 'Top' THEN 1 WHEN 'Bottom' THEN 2 END ASC,
    CASE Position WHEN 'Top' THEN Offset ELSE NULL END ASC,
    CASE Position WHEN 'Bottom' THEN Offset ELSE NULL END DESC

请注意,您还应该能够使用以下内容,因为 'Top' 的索引比 'Bottom' 小:

ORDER BY templateId ASC,
    Position ASC,
    CASE Position WHEN 'Top' THEN Offset ELSE NULL END ASC,
    CASE Position WHEN 'Bottom' THEN Offset ELSE NULL END DESC

【讨论】:

  • 如果Position 既不是Top 也不是Bottom,这将如何表现?
  • @SylvainLeroux 这不可能,因为它是一个枚举。
  • 它以某种方式将“底部”结果置于“顶部”结果之前。
  • @skiwi 你先要哪个?你没有指定。
  • @lc。啊,你是对的,我忘了提到这一点。 “顶部”需要先出现。
猜你喜欢
  • 2015-06-06
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-25
相关资源
最近更新 更多