【问题标题】:SQL to give X records after specified recordSQL 在指定记录后给出 X 记录
【发布时间】:2023-03-23 02:27:01
【问题描述】:

是否可以编写一条 SQL 语句,从具有条件 Z 的列表中检索具有条件 Y 的记录之后的 X 个连续记录?

例如,给定这张表:

id  name
------------------------------
1   aaa
5   bbb
10  ccc
15  ddd
20  eee
25  fff
30  ggg

我首先应用标准 Z,类似于

SELECT * WHERE (id>4) AND (id<26) ORDER BY id ASC

然后我留下一个列表:

id  name
------------------------------
5   bbb
10  ccc
15  ddd
20  eee
25  fff

我想知道是否可以从 name='ddd' (或其他一些条件 Y)的列表中检索 2 条记录,即返回上例中的“ddd”和“eee”记录。

应该可以直接在 SQL 中执行此操作,但恐怕我缺乏了解它的里程。

【问题讨论】:

  • 也许是 COUNT()、OFFSET() 和 LIMIT() 的组合?

标签: mysql sql database


【解决方案1】:

添加限制子句

SELECT * WHERE (id>4) AND (id<26) ORDER BY id ASC limit 2,2

编辑。

select * from table where id > (
select id from table where name = 'eee' ) 
order by id
limit 2

【讨论】:

    【解决方案2】:
    SELECT * 
    FROM yourTable
    WHERE id > 4 
      AND id < 26 
      AND id >= ( SELECT min(id) 
                  FROM yourTable
                  WHERE id > 4 
                    AND id < 26 
                    AND name = 'ddd'
                ) 
    ORDER BY id 
    LIMIT 2
    ;
    

    用你的措辞:

    SELECT * 
    FROM yourTable
    WHERE ( criterionZ )
      AND sortingField >=
                ( SELECT min(sortingField ) 
                  FROM yourTable
                  WHERE ( criterionZ )
                    AND ( criterionY )
                ) 
    ORDER BY sortingField
    LIMIT X
    ;
    

    【讨论】:

    • 非常感谢提供更通用的伪版本,非常有帮助
    • 注意:如果我们排序的是 DESC 而不是 ASC,min() 应该是 max(),>= 变成
    • 是的,MAX 代替 MIN&lt;= 代替 &gt;=: ...sortingField &lt;= ( SELECT MAX(...
    • 其实并不完美,因为选择sortingField的时候可能会有重复的值,而criteriaY的意思是只指定一条唯一的记录
    • @ypercube 是的,我的意思是重复的名字(对不起)
    【解决方案3】:

    假设您的身份证号码是连续的,您可以使用子查询:

    SELECT * FROM  table WHERE id >= (SELECT id FROM table WHERE name =  'ddd' LIMIT 1) LIMIT 2
    

    【讨论】:

    • 这确实考虑了 "criteriaZ"。如果例如第一行有id=1, name='ddd',它将给出错误的结果。如果您在子查询中添加AND id&gt;4 AND id&lt;26,并在外部查询中添加ORDER BY,则正确率为99%。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多