建议在数据库中存储多个OrderBy值的方法是什么?

时间:2019-01-17 04:26:23

标签: mysql mariadb

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

使用jQueryUI可以对主要级别进行排序(超出了此问题的范围,因此未显示此功能)。主级别不可排序,但是可以沿axis-y上下移动LEVEL x.x,然后可以在级别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

更新 这是查询运行时数据 的示例。这将允许我正确地遍历数据以生成所需的输出。我还包括指向Google文档的链接(只读)here

在下面的图片中,(1淡粉色)和(2淡黄色)是已知的数据样本,第(3),(4)和(5)列是所需的排序方式。

screen shot of sample data set

其他更新 创建该屏幕截图是一项极好的练习,确实使我考虑了数据(谢谢Rick!)。

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

场景:假设用户将与woaid = 19相对应的日期项从coreid = 444拖动到coreid = 232 / phaseID = 19 / weekID = 1,并且希望该项目成为新位置周下显示的最后一项(这是旧位置下的唯一物品,因此它自然只是一个“ 1”)。它的dayOrderBy ID将从1更改为4(它的coreID,phaseID,weekID也将相应地更新)。下次访问该页面时,应反映正确的排序顺序和位置,这意味着与woaid = 19对应的日期现在应显示为coreid = 232 / phaseID = 19 / weekID = 1 / dayID = 7下的第4个项目(dayID'如果更改,则只会更改orderByDayID)。

1 个答案:

答案 0 :(得分:0)

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

计划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