2017-06-18 24 views
0

の日付DESCと最新の選択:MySQLは、私は3つのテーブル持っている各アーティスト

  • 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キング)order by dateトラックから最新の3トラックを選択します。

+---------+--------------+----------------------+ 
| 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王&メタリカ)order by dateトラックから3最新のトラックを選択します。このような。このように:このクエリが動作しているが、ソート日付DESCが機能していない

+---------+--------------+----------------------+ 
| 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 | 
+---------+--------------+----------------------+ 

EDIT私は質問を見つけた場合

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

Ok ...選択できませんでしたか?どのようなクエリを試しましたか?どのような結果が戻ったのですか? –

+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

あなたの答えは真ですが、私は 'union 'なしでしたいです。 '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では、変数でこれを行うことができます:インナーWHERE

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; 

、あなたが好きなアーティストやその他の条件を指定することができます。

+0

私はテストしましたが、日付でソートされていません – grizzly

+0

@grizzly。 。 。私はあなたのコメントを理解していません。一番外側のクエリで 'order by 'を使って、全体のデータを並べ替えることができます。あなたの質問は、最新の日付に基づいて各アーティストのトップ3を選択することにあるようです。それがうまくいかないと言っていますか? –

+0

'm.date desc'は機能しません。ソングの選択は古い日付 – grizzly

関連する問題