2014-11-19 5 views
0

У меня есть таблица, называемая проводником. Я хочу выбрать последние записи, которые date меньше, чем my_value.Как выбрать последние записи меньше значения

+----+-----------+------+ 
| id | program | date | 
+----+-----------+------+ 
| 1 | program 1 | 1 | 
| 2 | program 1 | 3 | 
| 3 | program 2 | 3 | 
| 4 | program 1 | 5 | 
| 5 | program 1 | 7 | 
+----+-----------+------+ 

Если мы рассмотрим my_value является 4, то выход будет:

+----+-----------+------+ 
| id | program | date | 
+----+-----------+------+ 
| 2 | program 1 | 3 | 
| 3 | program 2 | 3 | 
+----+-----------+------+ 

Как я могу выбрать записи с помощью SQL?

+3

Перейти на. Попробуйте что-нибудь! – Strawberry

+0

Почему запись с датой 1 не появляется. –

+0

@AnkitBajpai: Последняя запись для даты менее 4 - это «программа 1» с датой '3' – SonalPM

ответ

1
SELECT * FROM Conductor 
WHERE `date` = (SELECT max(`date`) FROM Conductor 
       WHERE `date` < myvalue) 
+1

Этот запрос даст результат для даты = 4 сам! – Neels

+0

Что произойдет, если значение myvalue равно 5? – Milen

+0

Обратите внимание, что дата на самом деле не является зарезервированным словом! – Strawberry

0

Вы можете попробовать запрос типа:

SELECT * FROM conductor 
WHERE date = (SELECT date FROM conductor 
       WHERE date < my_value ORDER BY DESC limit 1); 

Это должно дать вам то, что вы ожидаете!

0
SELECT * FROM Conductor 
WHERE date IN (SELECT max(date) FROM Conductor 
       WHERE date < myvalue) 
0
DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,program VARCHAR(12) NOT NULL 
,date INT NOT NULL 
); 

INSERT INTO my_table VALUES 
(1 ,'program 1',1), 
(2 ,'program 1',3), 
(3 ,'program 2',3), 
(4 ,'program 1',5), 
(5 ,'program 1',7); 

SELECT * FROM my_table; 
+----+-----------+------+ 
| id | program | date | 
+----+-----------+------+ 
| 1 | program 1 | 1 | 
| 2 | program 1 | 3 | 
| 3 | program 2 | 3 | 
| 4 | program 1 | 5 | 
| 5 | program 1 | 7 | 
+----+-----------+------+ 

SELECT x.* 
    FROM my_table x 
    JOIN 
     (SELECT program 
      , MAX(date) max_date 
      FROM my_table 
     WHERE date < 4 
     GROUP 
      BY program 
    ) y 
    ON y.program = x.program 
    AND y.max_date = x.date; 
+----+-----------+------+ 
| id | program | date | 
+----+-----------+------+ 
| 2 | program 1 | 3 | 
| 3 | program 2 | 3 | 
+----+-----------+------+ 
Смежные вопросы