【问题标题】:SQL: ORDER BY `date` AND START WHERE`value`="something"?SQL: ORDER BY `date` AND START WHERE`value`="something"?
【发布时间】:2011-11-03 20:00:30
【问题描述】:

SQL 表:

-----------------------------------------
| ID  |   COLOR   |         DATE        |
|-----|-----------|---------------------|
|  1  | ORANGE    | 2011-11-03 01:14:00 |
|  2  | YELLOW    | 2011-11-03 01:13:00 |
|  3  | GREEN     | 2011-11-03 01:16:00 |
|  4  | BLUE      | 2011-11-03 01:16:00 |
|  5  | PINK      | 2011-11-03 01:12:00 |
-----------------------------------------

以下查询为我提供按日期排序的结果:

SELECT *
FROM `table`
ORDER BY `date` DESC
LIMIT 0, 4

-----------------------------------------
| RESULT:                               |
|---------------------------------------|
|  3  | GREEN     | 2011-11-03 01:16:00 |
|  4  | BLUE      | 2011-11-03 01:16:00 |
|  1  | ORANGE    | 2011-11-03 01:14:00 |
|  2  | YELLOW    | 2011-11-03 01:13:00 |
-----------------------------------------

但如果我想按日期订购并从特定的“颜色”开始呢?

SELECT *
FROM `table`
ORDER BY `date` DESC
LIMIT 0, 4
START WHERE `color`='blue'

-----------------------------------------
| RESULT I WANT:                        |
|---------------------------------------|
|  4  | BLUE      | 2011-11-03 01:16:00 |
|  1  | ORANGE    | 2011-11-03 01:14:00 |
|  2  | YELLOW    | 2011-11-03 01:13:00 |
|  5  | PINK      | 2011-11-03 01:12:00 |
-----------------------------------------

^获取此结果的正确语法是什么?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:
    SELECT 
      y.*
    FROM
      YourTable y
    WHERE
      y.date <= (SELECT yb.date FROM YourTable yb WHERE yb.color = 'BLUE')
    ORDER BY
      y.date DESC
    LIMIT 4 OFFSET 0
    

    更新:

    SELECT 
      y.*
    FROM
      YourTable y
    WHERE
      /* The colors 'before' blue */
      y.date < (SELECT yb.date FROM YourTable yb WHERE yb.color = 'BLUE') or
      /* And blue itself */
      y.color = 'BLUE'
    ORDER BY
      y.date DESC
    LIMIT 4 OFFSET 0
    

    第二次更新以满足新发现的标准。

    SELECT 
      y.*
    FROM
      YourTable y,
      (SELECT yb.id, yb.date FROM yb WHERE color = 'GREEN') ys
    WHERE
      /* The colors 'before' green */
      y.date < ys.date or
      /* The colors on the same date as green, but with greater 
         or equal id to green. This includes green itself.
         Note the parentheses here. */
      (y.date = ys.date and y.id >= ys.id)
    ORDER BY
      y.date DESC
    LIMIT 4 OFFSET 0
    

    【讨论】:

    • 唯一的问题是,如果两行的日期/时间相同,它不会从 color='BLUE' 的行开始,而是从 id 较低的行开始。有什么方法可以确保它从特定行开始?
    • 我更新了示例中的时间,以便您可以看到我在说什么。
    • 稍作修改的版本。 &lt;= 更改为 &lt; 以仅获取日期早于 BLUE 的颜色。第二个条件包括 BLUE 本身,与日期无关。
    • 一个问题。如果我想将 GREEN 指定为我的起始颜色(而不是蓝色),那么蓝色不会出现在结果中,即使列表中的蓝色排在绿色之后。
    • 所以你的意思是,现在 ID 也很重要?这就是为什么最好明确指定您需要的规则。示例不会让您直接到达那里,因为它们并未涵盖所有异常。 :)
    猜你喜欢
    • 2014-06-29
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    相关资源
    最近更新 更多