繁体   English   中英

Mysql为每个艺术家选择最新的日期desc

[英]Mysql select most recent with date desc for each artist

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

现在,我需要对这个结果进行很好的查询。 我想从(shakira & bb king) order by date曲目order by date选择 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 | 
+---------+--------------+----------------------+

或从(shakira & bb king & metala) order by date曲目order by date选择 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 | 
+---------+--------------+----------------------+

编辑:

此查询有效但排序日期 desc 无效:

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`)

如果我找到了问题,查询将如下所示:

  (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); 

另外,如果您想要查询的压缩格式,可以在这篇文章中找到。

在 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 ,您可以指定您喜欢的任何艺术家或其他条件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM