【问题标题】:Select records after id after ordering by another column按另一列排序后选择id后的记录
【发布时间】:2016-04-29 15:28:41
【问题描述】:

假设我们有一张按重量排序的桌子

  select id, 
         weight
    from TABLE
order by weight

;

id     weight
---   -------
66     2.50
12    12.00
11    24.00
19    25.00
 6    44.00
 7    45.00
 8    47.00
 9    48.00
10    50.00

我们只想返回大于或等于某个 id 权重的记录。 例如,如果我们想要 id=7 那么我们会得到

id     weight
---   -------
 7    45.00
 8    47.00
 9    48.00
10    50.00

或者换句话说,从id = 7的行开始按权重排序的表的所有记录。 我们不想要权重,我们想要 id。

【问题讨论】:

  • 你的意思是重量大于 45.00,因为 id 7 有这个值对吗?
  • 是的,我们想要“单选”解决方案 :)
  • 为什么要单选?有什么具体原因吗?

标签: php mysql sql postgresql


【解决方案1】:

我想一个简单的内部查询就可以了:

SELECT `id`
FROM   `TABLE`
WHERE  `weight` >= (SELECT `weight`
                    FROM   `TABLE`
                    WHERE  `id` = 7 
                    LIMIT 1)
ORDER BY `id`

【讨论】:

  • 不,afaik。只能通过加入同一张表。但这既不合逻辑也不可取。
  • 您忘记按重量订购 :) 谢谢。
【解决方案2】:

如果您想权重大于 id 7 记录,那么这将起作用:

  SELECT id, 
         weight 
    FROM TABLE
   WHERE weight >= (SELECT weight 
                      FROM TABLE 
                     WHERE id = 7)
ORDER BY weight

【讨论】:

    【解决方案3】:

    如果您真的想使用JOIN 而不是子查询:

    SELECT t1.id, t1.weight
    FROM TABLE AS t1
    JOIN TABLE AS t2 ON t1.weight >= t2.weight
    WHERE t2.id = 7
    ORDER BY t1.weight
    

    【讨论】:

      【解决方案4】:

      可以通过一次选择完成,但您必须使用用户定义的变量 像这样

      SELECT id, weight,
             CASE WHEN id = 7 THEN @weight := weight
                  ELSE @weight
             END AS compare_weight
      FROM `TABLE`
      HAVING weight >= compare_weight
      ORDER BY weight ASC
      

      http://sqlfiddle.com/#!9/4a846/9

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-16
        • 1970-01-01
        • 2014-03-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多