如果ID是按顺序排列的,如何在MySQL中获取行?

4

如果产品ID是连续的,我们需要获取行。

表格(产品)

product_id    name

    1         Parle
    2         Coconut
    3         Pizza
    4         Colgate
    5         Ice Cream
    6         Nuts
    8         Britania
    9         Pepsi

需要输出的结果

product_id    name

    1         Parle
    2         Coconut
    3         Pizza
    4         Colgate
    5         Ice Cream
    6         Nuts

product_id - 8和9没有得到,因为它们不是按顺序排列的。

我的翻译

select distinct t1.*, t1.product_id, (select GROUP_CONCAT(t2.product_id) from product as t2) as p_id
from product t1
having FIND_IN_SET(t1.product_id+1, p_id)

输出

product_id    name

    1         Parle
    2         Coconut
    3         Pizza
    4         Colgate
    5         Ice Cream

在这个尝试中,我没有得到product_id - 6行。

注:我想要的是MySql查询而不是PHP

谢谢!


你正在将分组属性附加到产品ID上,这个属性最好放在单独的列中。 - jeroen
序列从哪里开始? - M Khalid Junaid
只返回翻译后的文本:仅限1至6行,不要其他内容。 - Jaydeep Mor
1个回答

2

我能想到的一种方法是使用用户自定义变量获取行的排名,然后计算产品ID和排名之间的差异,并仅选择那些差异为0的行。

select *
from(
  select f.*,@row:= @row + 1 rank,
  product_id - @row as diff
  from product f,
  (select @row:= 0) t
  order by product_id
) t1
where diff = 0

演示

如果你想自动选择最小的序列号,可以写成:

select *
 from(
  select f.*,@row:= @row + 1 rank,
  product_id - @row as diff
  from product f,
  (select @row:= (select min(product_id)  from product_sale_flag) a) t
  order by product_id
) t1
where diff = -1

示例

说明 第一个查询product_id的最小值分配给变量@row,然后按升序为每行分配排名。一旦为每行分配了排名,它就计算出原始值product_id最后一个值之间的差异,并使用结果差异检查差异为0的行,因为它们遵循该顺序。希望这样说得通。


谢谢。它运行得非常好。但我不理解,请解释一下如果你愿意的话。 - Jaydeep Mor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接