2013-08-01 2 views
2

Вот в две таблицы, которые я присоединился вместе ...SQL Поиск предыдущую дату из другой соответствующей строки запроса

song_id song_name 
    51 | Song Name A 
    368 | Song Name B 
    168 | Song Name C 
    568 | Song Name D 
    13 | Song Name E 


song_id | song_order|  show_date  |show_id 
368  |  1  | 2010-02-17 00:00:00 | 367  
368  |  0  | 2012-04-06 00:00:00 | 499 
51  |  2  | 2012-01-19 00:00:00 | 399 
51  |  2  | 2013-04-24 00:00:00 | 870 
51  |  8  | 2013-07-19 00:00:00 | 899 
368  |  2  | 2013-07-19 00:00:00 | 899 
13  |  5  | 2013-07-19 00:00:00 | 899 
568  |  2  | 2013-07-19 00:00:00 | 899 
368  |  4  | 2012-06-08 00:00:00 | 799 
168  |  2  | 2013-06-28 00:00:00 | 896 
568  |  2  | 2013-07-03 00:00:00 | 897 
568  |  2  | 2010-02-21 00:00:00 | 897 

я работал, что я пытаюсь сделать на SQL Fiddle link но я не может получить код в порядке. Я пытаюсь на основе значения show_id сказать его «899», вернуть все строки, равные 899, show_ids имеют одну и ту же дату, назначенную им, но на основе идентификатора песни я хочу вернуть предыдущую дату, когда song_id появляется.

Я хотел бы данные, чтобы вернуться ...

SHOW_DATE | SHOW_ID | SONG_NAME | SONG_ID |  PREVDATE 
July, 19 2013 |  899 | Song Name A |  51 | April, 24 2013 
July, 19 2013 |  899 | Song Name B |  368 | April, 08 2012 
July, 19 2013 |  899 | Song Name E |  13 | FIRST TIME 
July, 19 2013 |  899 | Song Name D |  568 | July, 03 2013 

Мой код здесь просто возвращение предыдущей даты до июля, 19 2013, которая является июль, 03 2013 и положить, что для каждого PrevDate. Может ли кто-нибудь мне помочь? Я не самый опытный кодер, и я считаю, что не могу делать то, что я здесь сделал, потому что я группирую подзапрос. Заранее спасибо!

SELECT tbl_shows.show_date, tbl_shows.show_id, 
tbl_songs.song_name, tbl_shows.song_id, (
    SELECT 
     MAX(show_date) 
    FROM tbl_shows AS fdate 
    WHERE tbl_shows.show_date > show_date 
) As PrevDate 
    FROM tbl_shows LEFT JOIN tbl_songs 
    ON tbl_shows.song_id = tbl_songs.song_id 
    WHERE tbl_shows.show_id = 899 

ответ

0

попробовать это ...

SELECT a.show_date, a.show_id, 
    b.song_name, a.song_id, (
    SELECT 
    MAX(show_date) 
    FROM tbl_shows AS c 
    WHERE a.show_date > c.show_date and a.song_id = c.song_id 
) As PrevDate 
    FROM tbl_shows a, tbl_songs b 
    WHERE a.song_id = b.song_id 
    AND a.show_id = 899 
+0

спасибо m.zam Я просто не мог обернуть голову вокруг этого ... вы спасатель! – davejt

1

Похоже, вам просто нужно сказать MySQL, чтобы сгруппировать результаты по дате:

SELECT tbl_shows.show_date, tbl_shows.show_id, 
tbl_songs.song_name, tbl_shows.song_id, (
    SELECT 
     MAX(show_date) 
    FROM tbl_shows AS fdate 
    WHERE tbl_shows.show_date > show_date 
) As PrevDate 
FROM tbl_shows LEFT JOIN tbl_songs 
ON tbl_shows.song_id = tbl_songs.song_id 
GROUP BY tbl_shows.show_date 
HAVING tbl_shows.show_id = 899 

EDIT: Или, как Дэн Bracuk отметил, вы можете сделать это:

SELECT tbl_shows.show_date, tbl_shows.show_id, 
tbl_songs.song_name, tbl_shows.song_id, (
    SELECT 
     MAX(show_date) 
    FROM tbl_shows AS fdate 
    WHERE tbl_shows.show_date > show_date 
) As PrevDate 
FROM tbl_shows 
LEFT JOIN tbl_songs 
ON tbl_shows.song_id = tbl_songs.song_id 
WHERE tbl_shows.show_id = 899 
GROUP BY tbl_shows.show_date 
ORDER BY tbl_shows.show_id DESC 
LIMIT 0, 10 

Примечание: последние две строки являются скорее примером, чем чем-либо еще.

+0

У вас есть ключевое слово, имеющее в месте, где вы должны иметь ключевое слово, где. Хотите исправить это, прежде чем оно будет уменьшено? –

+0

Я * исправил бы это, но, может быть, я этого не вижу ...? Или вы имеете в виду подзапрос? EDIT: ОК, я думаю, я понимаю, о чем вы говорите ... – jerdiggity

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