2015-11-29 5 views
4
 
------------------------- 
| ID | RID | DATE  | // TABLE A 
------------------------- 
| 1 | 1 | 2015-01-01 | // 1st edition 
| 2 | 2 | 2015-01-01 | // 1st edition 
| 3 | 1 | 2015-02-01 | // 2nd edition 
| 4 | 4 | 2015-01-01 | // 1st edition 
| 5 | 1 | 2015-05-01 |  // 3rd edition 
| 6 | 6 | 2015-01-01 | // 1st edition 
| 7 | 6 | 2015-01-10 |  // 3rd edition 
| 8 | 6 | 2015-01-12 |  // 4th edition 
| 9 | 6 | 2015-01-02 | // 2nd edition 
------------------------- 

Таблица A состоит из записей, описывающих «файловые издания». До сих пор, я был в состоянии произвести ЗЕЬЕСТ, который будет выбрать из последнее издание с этим:Выбор последней редакции на конкретную дату

 
    SELECT `t1`.`id` AS `id`, `t1`.`rid` AS `rid`, `t1`.`date` AS `date` 
    FROM `table_a` `t1` 
    WHERE (`t1`.`date` = (
     SELECT MAX(`t2`.`date`) 
     FROM `table_a` `t2` 
     WHERE (`t2`.`rid` = `t1`.`rid`) 
    )) 

Что дает мне что-то вроде этого:

 
------------------------- 
| ID | RID | DATE  | // TABLE B 
------------------------- 
| 2 | 2 | 2015-01-01 | // 1st edition 
| 4 | 4 | 2015-01-01 | // 1st edition 
| 5 | 1 | 2015-05-01 |  // 3rd edition 
| 8 | 6 | 2015-01-12 |  // 4th edition 
------------------------- 

Но мой вопрос , как настроить инструкцию SELECT, чтобы я получал все последние выпуски на определенную дату? например, скажем, I хотел найти последнюю версию с 2015-01-11? Я хотел бы получить результат, аналогичную таблицу C:

 
------------------------- 
| ID | RID | DATE  | // TABLE C 
------------------------- 
| 1 | 1 | 2015-01-01 | // 1st edition 
| 2 | 2 | 2015-01-01 | // 1st edition 
| 4 | 4 | 2015-01-01 | // 1st edition 
| 7 | 6 | 2015-01-10 |  // 3rd edition 
------------------------- 

Если есть решение уже там, мои извинения заранее, но я попытался найти с помощью этих ключевых слов/фраз: «MySQL выбрать последнее издание как от даты "и нашли очень мало помощи до сих пор ...

Также я понимаю, что я могу переусердствовать в этом, и это может быть очень простая настройка, например, возможно, изменение SELECT MAX или добавление другого условия на второе WHERE пункт.

Благодаря


UPDATE: Благодаря Musa, я должен думать об этом в шагах; другой метод. На первом этапе необходимо выбрать все даты: < = 2015-01-11. Второй шаг - отфильтровать MAX (дата), где ID = RID (т. Е. Последнее издание). Что касается слияния двух операторов SELECT, с которыми я сталкиваюсь.

+0

, но в таблице C вы выбираете новейшие издания –

+0

различие между таблицами B и C; если «по состоянию на 2015-01-11» было «по состоянию на 2015-01-12» вместо этого, оно выдавало бы ID 8, а не ID 7 ... – Nick

+0

, чтобы вы хотели использовать более старое издание? –

ответ

1

Я думаю, что вы можете сделать что-то, как это:

SELECT 
    `t1`.`id` AS `id`, 
    `t1`.`rid` AS `rid`, 
    `t1`.`date` AS `date` 
FROM `table_a` `t1` 
WHERE 
    `t1`.`date` = (
     SELECT MAX(`t2`.`date`) 
     FROM `table_a` `t2` 
     WHERE (`t2`.`rid` = `t1`.`rid`) 
    ) 
    and `t1`.`date` <= '2015-01-11' # I have added this line 

Вы хотите последнее издание должно быть меньше или равна другой даты (2015-01-11 здесь), так что я думаю, что вы можете получить его добавив и раздел AND в ваш пункт WHERE. Остальная часть вашего запроса такая же.

+0

Запрос работает, однако имеет нежелательные результаты. Однако он разъясняет методологию. В этом запросе он фильтрует последнюю версию (MAX date), а затем отфильтровывает все даты, которые> 2015-01-11. Например, он отфильтрует идентификаторы 5 и 8. – Nick

+0

@nick, что вы подразумеваете под нежелательным результатом? – Musa

+0

Я только получаю id 2 и 4, потому что у них нет более поздних выпусков: у других идентификаторов есть более поздние версии, но из-за MAX (date) они сначала отфильтровываются, а затем MAX (дата) также фильтруется из-за < = 2015-01-11 ... – Nick

Смежные вопросы