2017-06-18 52 views
0

我有3個表:Mysql的選擇最近一次與日遞減每位藝術家

  • PK:主鍵
  • FK:外鍵

的MP3表:

+---------+--------------+----------------------+ 
| id (PK) | tarck_title | date     | 
+---------+--------------+----------------------+ 
| 100  | shakira  | 2001-01-12 00:00:00 | 
| 101  | metallica | 2002-01-12 00:00:00 | 
| 102  | james blunt | 2003-01-12 00:00:00 | 
| 103  | shakira  | 2004-01-12 00:00:00 | 
| 104  | anathema  | 2005-01-12 00:00:00 | 
| 105  | nelson  | 2006-01-12 00:00:00 | 
| 106  | shakira  | 2007-01-12 00:00:00 | 
| 107  | bb king  | 2008-01-12 00:00:00 | 
| 108  | metallica | 2009-01-12 00:00:00 | 
| 109  | nelson  | 2010-01-12 00:00:00 | 
| 110  | shakira  | 2011-01-12 00:00:00 | 
| 111  | bb king  | 2012-01-12 00:00:00 | 
+---------+--------------+----------------------+ 

藝術家表:

+---------+----------------+ 
| id (PK) | artist_name | 
+---------+----------------+ 
| 14  | shakira  | 
| 221  | metallica  | 
| 320  | james blunt | 
| 328  | shakira  | 
| 1004 | anathema  | 
| 1140 | nelson   | 
| 1401 | bb king  | 
+---------+----------------+ 

標籤表:PK(mp3_id,artist_id)

+-------------+----------------+ 
| mp3_id (FK) | artist_id (FK) | 
+-------------+----------------+ 
| 100   | 14    | 
| 101   | 221   | 
| 102   | 320   | 
| 103   | 14    | 
| 104   | 1004   | 
| 105   | 1140   | 
| 106   | 14    | 
| 107   | 1401   | 
| 108   | 221   | 
| 109   | 1140   | 
| 110   | 14    | 
| 111   | 1401   | 
+---------+--------------------+ 

現在,我需要爲這個resaults好的查詢。我想從(夏奇拉& bb國王)選擇3最新曲目order by date軌道。像這樣:

+---------+--------------+----------------------+ 
| id (PK) | tarck_title | date     | 
+---------+--------------+----------------------+ 
| 110  | shakira  | 2011-01-12 00:00:00 | 
| 106  | shakira  | 2007-01-12 00:00:00 | 
| 103  | shakira  | 2004-01-12 00:00:00 | 
| 111  | bb king  | 2012-01-12 00:00:00 | 
| 107  | bb king  | 2008-01-12 00:00:00 | 
+---------+--------------+----------------------+ 

,或者選擇從(夏奇拉& BB金& METALLICA)3最新跟蹤order by date軌道。像這樣:

+---------+--------------+----------------------+ 
| id (PK) | tarck_title | date     | 
+---------+--------------+----------------------+ 
| 110  | shakira  | 2011-01-12 00:00:00 | 
| 106  | shakira  | 2007-01-12 00:00:00 | 
| 103  | shakira  | 2004-01-12 00:00:00 | 
| 111  | bb king  | 2012-01-12 00:00:00 | 
| 107  | bb king  | 2008-01-12 00:00:00 | 
| 108  | metallica | 2009-01-12 00:00:00 | 
| 101  | metallica | 2002-01-12 00:00:00 | 
+---------+--------------+----------------------+ 

編輯:

這個查詢工作,但數據排序倒序不工作:

SELECT `id`, `tarck_title`, `date` 
     FROM `mp3s` 
     WHERE `id` IN (
      SELECT x.`mp3_id` 
      FROM `tags` x 
      INNER JOIN `tags` y ON y.`artist_id` = x.`artist_id` AND y.`mp3_id` <= x.`mp3_id` 
      INNER JOIN `mp3s` z ON z.`id` = x.`mp3_id` 
      WHERE x.`artist_id` IN (SELECT `artist_id` FROM `tags` WHERE `mp3_id` = 103) 
      GROUP BY x.`mp3_id` HAVING COUNT(*) <= 3 
      ORDER BY z.`date` DESC, x.`artist_id` DESC, x.`mp3_id`) 
+0

好的......那你不能選擇嗎?你試過什麼查詢?它返回了什麼結果? –

+0

@ChetanRanpariya我測試2,3個查詢試試。但按日期排序是我的問題 – grizzly

回答

1

如果我發現這個問題,查詢將是這樣的:

(SELECT m.* FROM (tags as t JOIN artists as a on t.artist_id = a.id) JOIN mp3s as m on m.id = t.mp3_id 
    WHERE a.artist_name = 'Shakira' 
    ORDER BY m.date DESC 
    LIMIT 3) 
    UNION 
    (SELECT m.* FROM (tags as t JOIN artists as a on t.artist_id = a.id) JOIN mp3s as m on m.id = t.mp3_id 
    WHERE a.artist_name = 'bb King' 
    ORDER BY m.date DESC 
    LIMIT 3); 

此外,如果你想要一個壓縮格式的查詢,你可以在this post找到它。

+0

你的回答是真實的,但我想沒有'工會'。因爲'a.artist_name'的數量沒有修復。 – grizzly

+0

@grizzly你有沒有看到引用的帖子? – OmG

+0

是的。 [這篇文章](https://stackoverflow.com/questions/2129693/using-limit-within-group-by-to-get-n-results-per-group)??? – grizzly

1

在MySQL中,你可以通過使用變量做到這一點:

SELECT m.* 
FROM (SELECT m.*, 
      (@rn := if(@a = a.id, @rn + 1, 
         if(@a := a.id, 1, 1) 
         ) 
      ) as rn 
     FROM tags t JOIN 
      artists a 
      ON t.artist_id = a.id JOIN 
      mp3s m 
      ON m.id = t.mp3_id CROSS JOIN 
      (SELECT @a := -1, @rn := 0) params 
     WHERE . . . 
     ORDER BY a.id, m.date DESC 
    ) m 
WHERE rn <= 3; 

在內部WHERE,你可以指定任何你喜歡的藝術家或其他條件。

+0

我測試過,但沒有按日期排序 – grizzly

+0

@grizzly。 。 。我不明白你的評論。您可以使用最外層查詢中的'order by'對所有數據進行排序。你的問題似乎是根據最近的日期爲每位藝術家選擇前三名。你是說這是行不通的嗎? –

+0

'm.date desc'不起作用。歌曲選擇是基於舊日期 – grizzly