在MySQL记录中生成范围

时间:2016-04-03 17:39:38

标签: php mysql

之前我读过其他类似的问题,但似乎没有人回答我的问题。如果这是其他事情的重复,我会道歉,但我似乎无法在其他地方找到这个问题。

我有一个看起来或多或少的数据库表:

ID | URL | Title | Episode | Sequence | Created_at | Modified_at

这些用于指定播客剧集的特定链接,并按照Sequence所示的顺序显示。我已经建立了一个与桌面交互的Laravel框架,我能够通过操纵序列来改变事物的顺序,但是我在删除事物和维护序列方面遇到了麻烦我想要它。假设我在表格中有以下四项内容:

id = 5, sequence = 1
id = 6, sequence = 3
id = 7, sequence = 2
id = 8, sequence = 4

在查看网站时,该网页会在id订单5,7,6,8中列出它们。但是,如果我发现其中一个链接存在问题,我会删除它,此时我可能会留下id的5,7,8。序列将是1,2,4。

我现在正在寻找的是一种“重新播种”的方式。基于每集的序列列。它基本上是所有具有特定episode的行,在sequence上按升序排序,然后"重新编号"它们按升序排列。序列= 1,2,4,5,7,8,9将变为1,2,3,4,5,6,7。

2 个答案:

答案 0 :(得分:0)

它应该是一个相对简单的查询,例如

select
      YT.*
   from
      YourTable YT
   where
      YT.Episode = 'MO50'
   order by
      YT.Sequence

现在,如果您的序列因任何原因而创建间隙,无论ACTUAL序列如何,您都可以始终实现mySql变量的增量。试试..

select
      @tmpRow := @tmpRow +1 as NewSequence,
      YT.*
   from
      YourTable YT,
      ( select @tmpRow := 0 ) sqlvars
   where
      YT.Episode = 'MO50'
   order by
      YT.Sequence

因此,即使您给定的显示“MO50”的实际序列是2,3,8,12,15。实际列“NewSequence”将显示为1,2,3,4,5。

现在,那说,您仍然会将原始的“ID”列作为编辑任何细节的基础,或者根据需要删除剧集......这对您有帮助吗?

答案 1 :(得分:0)

我不知道是否有内置功能可以优雅地完成所需的功能。

这是一种愚蠢的做法。

假设您要将id = 8从序列4移动到2。

UPDATE episodes 
SET sequence = sequence+1 
WHERE episode='Episode Name' 
  AND sequence BETWEEN 2 AND 4;

UPDATE episodes
SET sequence = 2
WHERE id = 8;

您希望始终将其置于事务中,以确保您的序列不会过时。

sequence+1用于将项目移动到列表中。如果你向下移动它将是-1

这也意味着如果删除行,则必须保持序列。因此,如果您删除了某些内容,则必须将其下方的所有内容都移到其中。在交易中也这样做。

如果您有一个跨越剧集和序列列的唯一键,那么您可能遇到此问题。你应该严格。您必须先在要移动的行上分配临时序列值,以避免重复键错误。