【发布时间】: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 添加了额外的小提琴(包括创建表小提琴)。原始问题已被修改,以消除问题中的一些绒毛。