2

这是我连接在一起的两张桌子......

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链接上要做什么,但我无法正确获取代码。我正在尝试根据 show_id 的值说它的“899”,返回所有等于 899 的行,show_ids 都分配了相同的日期,但基于歌曲 ID,我想返回 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

我的代码只是返回 2013 年 7 月 19 日之前的上一个日期,即 2013 年 7 月 3 日,并将其用于每个 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
4

2 回答 2

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

编辑:或者,正如 Dan 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

注意:最后两行更多的是一个例子。

于 2013-08-01T23:39:21.987 回答
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
于 2013-08-02T00:01:48.547 回答