【问题标题】:What is the recommended way to store multiple OrderBy values in a database?在数据库中存储多个 OrderBy 值的推荐方法是什么?
【发布时间】:2019-01-17 04:26:23
【问题描述】:

我有一个项目列表,其中包含一个项目子列表和一个项目子列表(总共 3 个级别)。

主级别可使用 jQueryUI 进行排序(超出此问题的范围,因此未显示此功能)。主层不可排序,但 LEVEL x.x 可以沿 axis-y 上下移动,然后可以在层 x.x.x 上进行单独排序。 axis-y 是为了防止 LEVEL 1 被丢弃在 LEVEL 2.1.3 上(如果发生这种情况,我们会像 Chuck Norris 一样可以除以零,但我离题了)。

我的问题是什么是最佳实践,在数据库中让每个级别都有自己的 sort by 列,或者对需要排序的任何内容使用单个列?

Maria 10.x 正在运行。

更新 对于上下文,这将是一个活动列表。您单击箭头,列表将显示菜单,因此主键将是活动 ID。

更新 我提供了我从一开始就使用的查询。我还没有收到任何指示,但希望这个查询可能会有所帮助。

SELECT DISTINCT
  a c.coreID,
  c.coreLabel,
  a.phaseOrderBy,
  a.weekOrderby,
  a.dayOrderBy,
  c.groupID,
  a.woAID,
  a.phaseID,
  (CASE
    WHEN p.phaseID is null
    THEN CONCAT('NONE')
    ELSE p.phaseLabel
    END) as phaseLabel,
  a.weekID,
  a.dayID,
  (CASE
    WHEN w.weekLabel is null
    THEN CONCAT('NONE')
    ELSE W.weekLabel
    END) as weekLabel,
  c.uc,
  c.um
FROM
  activity a
  LEFT JOIN phase p ON p.phaseID = a.phaseID
  LEFT JOIN core c ON c.coreID = a.coreID
  LEFT JOIN week w ON w.weekid = a.weekID
WHERE
  c.orgID = :orgID AND
  c.userID = :userID
ORDER BY
  c.coreLabel
  , a.phaseOrderBy
  -- , a.phaseID
  , a.weekOrderBy
  -- , a.weekID
  , a.dayOrderBy
  -- , a.dayID

我还有另一个小提琴可能有助于说明我正在尝试完成的功能:jsFiddle with sorting implemented

这里是dbFiddle

更新 以下是运行查询时数据应该的样子的示例。这将允许我正确循环数据以生成我需要的输出。我还包括一个指向谷歌文档的链接(只读)here

在下图中,(1 pink-ish) 和 (2 yellow-ish) 是已知数据样本和列 (3)、(4) 和 (5) 所需的 orderBy ordering。

另一个更新 创建那个截图是一个很好的练习,真的让我想到了数据(谢谢你 Rick!)。

woaid 中的数据只是一个 PK,我应该将其随机化 - 我只是没有考虑过,因此对于它可能造成的混乱,我深表歉意。

场景:假设用户将 woaid=19 对应的 day 项从 coreid=444 拖到 coreid=232/phaseID=19/weekID=1 并希望该项成为新位置 week 下显示的最后一项(它是旧位置下唯一的项目,所以它自然只是一个“1”)。它的 dayOrderBy id 将从 1 更改为 4(它的 coreID、phaseID、weekID 也会相应地更新)。下次访问该页面应反映正确的排序顺序和位置,这意味着对应于 woaid=19 的日期现在应显示为 coreid=232/phaseID=19/weekID=1/dayID=7 下的第 4 项(dayID 没有t 改变,只有 orderByDayID 会改变)。

【问题讨论】:

  • 请提供SHOW CREATE TABLE
  • 新项目,还没有表。我过去做过排序,但它只有一层,所以排序很简单。这个我认为可能不会那么直截了当。
  • @RickJames 添加了额外的小提琴(包括创建表小提琴)。原始问题已被修改,以消除问题中的一些绒毛。

标签: mysql mariadb


【解决方案1】:

如果问题是关于ORDER BY,我看到两种方法:

Plan A:动态构造查询(尤其是ORDER BY 部分),然后执行它。这使您可以使用用户需要的任何列。

计划 B:使用 CASEIF() 表达式来计算单个值以进行排序。示例:

ORDER BY 
    CASE WHEN ... THEN phaseOrderBy
         WHEN ... THEN weekOrderBy
         ...
    END

或者……

ORDER BY
    IF(..., phaseOrderBy, IF(..., weekOrderBy, ... ))

根据提供的图片,其中任何一个都会给出所需的顺序:

ORDER BY coreID, phaseOrderBy, weekOrderBy

或者干脆

ORDER BY woAID

【讨论】:

  • 我将如何使用给定的查询执行任一选项?或者,您是否建议根据输出所需数据的阶段/周/天多次运行查询?
  • @HPWD - 是什么控制了这个选择?别的专栏?一些输入参数?
  • 你指的是什么选择?在 where 子句中,:userID:orgID 只是从用户用户身份验证进入网站管理区域的会话变量。
  • @HPWD - 我很困惑。请提供您想要的输出示例。
  • 添加了示例数据的屏幕截图以及指向 Google 文档的只读链接以提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 2011-02-14
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多