【问题标题】:MySQL: Conditionally selecting next and previous rowsMySQL:有条件地选择下一行和上一行
【发布时间】:2008-10-03 23:04:46
【问题描述】:

http://thedailywtf.com/Articles/The-Hot-Room.aspx

您是否看到底部有指向下一篇和上一篇文章的链接(“Unprepared For Divide_By_Zero”和“A Completely different game”)?我该怎么做,但要选择下一篇和上一篇非私人文章?这适用于选择下一篇文章:

SELECT * FROM articles WHERE id > ? AND private IS NULL

但我找不到选择上一篇文章的方法。

什么是正确/有效的方法,最好是在一个查询中?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    或者扩展杰里米的答案...
    在一个查询中

    (SELECT * FROM articles WHERE id > ? 
     AND private IS NULL 
     ORDER BY id ASC LIMIT 1) 
    UNION 
    (SELECT * FROM articles WHERE id < ? 
     AND private IS NULL 
     ORDER BY id DESC LIMIT 1)
    

    【讨论】:

    • 当您在选择的第一条/最后一条记录时,这个表现很奇怪。它只返回一条记录,但我找不到找出哪条记录的方法。
    • 如果当前文章 ID 为 10 并且查询只返回一个结果,您可以这样做: - 如果 ID 低于 10,则文章较旧 - 如果 ID 高于 10 ,文章较新如果还是没有解决问题,可以扩展查询,加一些有意义的列,比如select 'newer' as when, * from articles ...
    【解决方案2】:

    我会这样做:

    -- next
    SELECT * FROM articles WHERE id > ? AND private IS NULL ORDER BY id ASC LIMIT 1
    
    -- previous
    SELECT * FROM articles WHERE id < ? AND private IS NULL ORDER BY id DESC LIMIT 1
    

    我不确定如何在一个查询中执行此操作。我唯一能想到的可能是在一个查询中同时获取您正在显示的文章和下一篇文章,但这可能太混乱了。

    【讨论】:

      【解决方案3】:

      嵌套选择怎么样?

      SELECT * FROM articles WHERE id IN (
          SELECT id FROM articles WHERE id > ? AND private IS NULL ORDER BY id ASC LIMIT 1)
      )
      OR id IN (
          SELECT id FROM articles WHERE id < ? AND private IS NULL ORDER BY id DESC LIMIT 1
      );
      

      【讨论】:

        【解决方案4】:

        在您的特定情况下,您可以摆脱子选择等,但如果您需要更复杂的东西(例如:给定初始余额以及付款和退款列表,计算每个时间点的帐户余额),您可能会想写一个使用 SQL REPEAT/WHILE/LOOP 子句并允许使用变量等的存储过程。

        【讨论】:

          猜你喜欢
          • 2021-05-30
          • 2020-12-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-21
          • 2013-03-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多