【问题标题】:order on id and subid按 id 和 subid 排序
【发布时间】:2017-08-28 12:26:22
【问题描述】:

我有这个 MySql 表(默认按 id 排序):

id subid value
1  0     value 1
2  0     value 2
3  1     sub of 1
4  1     sub of 1
5  2     sub of 2
6  2     sub of 2
7  5     sub of 5

我需要一个返回列表的查询,按 id 和 subid 排序,如下所示:

1  0     value 1
3  1     sub of 1
4  1     sub of 1
2  0     value 2
5  2     sub of 2
7  5     sub of 5
6  2     sub of 2

因此,一个 id 的 subs 直接位于该 id 行的下方(在此示例中,id1 有 2 个 subs,它们直接出现在 id1 的行下方。id7 的 subid 为 5,因此直接出现在 id5 的行下方

subs 可以无限深

我怎样才能得到这个结果?

谢谢!

【问题讨论】:

  • 你试过这样的吗?ORDER BY ID,SUBID
  • 是的,试过了,它返回的列表和原来的一样:-(
  • 对 mySQL 的层次结构进行排序的 GOOGLE 搜索返回:stackoverflow.com/questions/14890204/order-sql-tree-hierarchystackoverflow.com/questions/15852045/…stackoverflow.com/questions/10000643/… 其中大部分似乎是可行的。
  • 在仔细检查了第二个和第三个选项之后,我认为它们不会起作用。第一个选项似乎是最有希望的;但需要结构变化。我能看到这样做的唯一方法是使用递归函数将路径传递到下一级,直到定义完整路径。但我认为那会很昂贵;所以存储路径似乎是最有效的解决方案。

标签: mysql sql


【解决方案1】:

尝试这样的事情:

SELECT ID,SUBID,Value
FROM TableName
ORDER BY RIGHT(Value,CHAR_LENGTH(SUBID)),ID

【讨论】:

  • ID 是唯一的。首先按它排序将导致原始顺序。而不是 1,3,4, 2... 所需的订单。
  • 你说的可能是正确的。但是让op先试试这个。 :P
  • 好的;但这里有一个示例显示它不会产生预期的结果:rextester.com/NYZCK71234
  • @xQbert 更新了 ORDER By 子句中的列顺序。你现在可以检查一下。
  • 更接近;但 ID 的 6/7 顺序错误。 rextester.com/ZDXT30152 随时自行测试。这里的问题是“subs 可以无限深”这意味着要获得这个,您需要递归循环每个记录的所有记录并保持到祖先的“路径”。为此,我们还必须填充或以某种方式跟踪每组,以便数字可能类似于 00001.00015.00087.000018 4 层深;每次都排在最前面的祖先。这样字符串比较是一致的。这在 mySQL 中是一项不平凡的工作。
【解决方案2】:

谢谢大家的回答,这样的数据返回好像挺难的。
请允许我向您提供有关我的目标的更多信息:
我正在 Laravel 中构建一个项目,并希望按该顺序显示数据,因为我使用的是 jQuery 插件 jQueryTreetable (http://ludo.cubicphuse.nl/jquery-treetable/),在他们的网站上您可以阅读此评论:

请注意,插件希望 HTML 表中的行与它们在树中显示的顺序相同。例如,假设您有三个节点:A、B(节点 A 的子节点)和 C(节点 B 的子节点)。如果您按以下顺序 A - C - B 在 HTML 表中为这些节点创建行,则树将无法正确显示。您必须确保行的顺序是 A - B - C。

也许解决方案可以将数据转换为 JSON 格式,并让 javascript 更改数据的顺序?

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 2018-10-05
    • 2015-01-07
    • 2017-12-31
    相关资源
    最近更新 更多