我有一个项目列表,其中有一个项目子列表和一个项目子列表(共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)列是所需的排序方式。
其他更新 创建该屏幕截图是一项极好的练习,确实使我考虑了数据(谢谢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)。
答案 0 :(得分:0)
如果问题是关于ORDER BY
的,我会看到两种方法:
计划A:动态构造查询(尤其是ORDER BY
部分),然后执行它。这样您就可以使用用户需要的任何列。
计划B:使用CASE
或IF()
表达式来计算要排序的单个值。示例:
ORDER BY
CASE WHEN ... THEN phaseOrderBy
WHEN ... THEN weekOrderBy
...
END
或者...
ORDER BY
IF(..., phaseOrderBy, IF(..., weekOrderBy, ... ))
根据所提供的图像,这两个都将提供所需的顺序:
ORDER BY coreID, phaseOrderBy, weekOrderBy
或者简单地
ORDER BY woAID