SQL: ЗАКАЗАТЬ ПО `date` И НАЧАТЬ ГДЕ`value` =" что-то "? - PullRequest
1 голос
/ 04 ноября 2011

Таблица 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 |
-----------------------------------------

^ Какой правильный синтаксис для получения этого результата?

1 Ответ

3 голосов
/ 04 ноября 2011
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...