2016-04-03 79 views
1

我之前通过其他类似的问题阅读过,但似乎没有人回答我的问题。道歉,如果这是别的事情的重复,但我似乎无法在其他地方找到这个问题。在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 s 5,7,8。序列将是1,2,4。

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

+0

为什么这是一个问题,因为数量一直在增长? – Mihai

+0

当我需要改变事物的顺序时,问题就出现了。如果顺序列表是1,2,3,5,6,并且我想在顺序中移动5“向上”,则需要做很多额外的工作以实现不存在4等。这将是从开发的角度来看,如果我可以在它之前或之后交换序列值,这取决于我是在向上还是向下移动某个东西。 –

+0

您能否显示更多的数据以及ID和序列......您可以执行查询,获取正确的序列和数字行表示,而无需硬编码引用序列。你提到情节,是否有另一个元素,如“我的XYZ秀”,第1-9集,它们都以不同顺序添加,因此排序? – DRapp

回答

0

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

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

现在,如果您的序列创建不管出于什么原因差距你总是可以实现一个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”列作为编辑任何细节的基础,或根据需要删除剧集......这是否对你有帮助?

0

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

这是一个愚蠢的做法。

假设你想从序列4移动ID = 8〜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

这也意味着如果您删除一行,您必须保持序列。所以,如果你删除了一些东西,你必须将其中的所有东西都转移到其中。在交易中也要这样做。

如果你有一个问题,这是如果你有一个唯一的键跨越情节和序列列。你应该严格的。您必须在首先移动的行上分配一个临时序列值,以避免重复键错误。

+0

对,我的问题恰恰出现在你微风轻拂的一句话中:“所以如果你删除了一些东西,你必须将其中的所有东西都转换成一个,在交易中也要这样做”。其余的我没有问题 - 不知道我是否正确解释了我的问题。创建,选择,修改,没有问题。但是,如果我删除一行,重新编号其余的行是我无法弄清楚该怎么做。 –

+1

假设你想从表中删除id = 7(sequence 2)。您只需删除该行。然后-1所有行WHERE序列> 2的序列值。在交易中这样做。 –