【问题标题】:Multiple ORDER BY (get latest element) MySQL多个 ORDER BY (获取最新元素) MySQL
【发布时间】:2015-04-25 14:01:17
【问题描述】:

我有以下表格:收音机、播客和节目。收音机有很多播客,播客有很多节目。每个播客可以按其历史排序,每个节目可以按其发布日期排序。

我想获取与其最新节目相关的所有播客。

查询看起来像这样:

SELECT r.name AS radio_name,Pod.*,Sh.* 
FROM podcasts Pod 
  INNER JOIN radios r ON (r.id=Pod.radio_id) 
  INNER JOIN shows Sh ON (Sh.podcast_id=Pod.id) 
ORDER BY Pod.history LIMIT 5

我想要第二个ORDER BY Sh.publication_date,但我真的不知道应该在哪里。

【问题讨论】:

    标签: mysql sql select sql-order-by


    【解决方案1】:

    如果您只想要每个播客的最新节目,那么您需要一些东西来获取该信息。这是一种方法:

    SELECT r.name AS radio_name,Pod.*,Sh.* 
    FROM podcasts Pod INNER JOIN
         radios r
         ON r.id = Pod.radio_id INNER JOIN
         shows Sh
         ON Sh.podcast_id = Pod.id 
    WHERE NOT EXISTS (select 1
                      from shows sh2
                      where sh2.podcast_id = sh.podcast_id.id and
                            sh2.publication_date > sh.publication_date
                     )
    ORDER BY sh.publication_date DESC
    LIMIT 5;
    

    除了连接列上的“明显”索引之外,您还需要shows(podcast_id, publication_date) 上的索引。

    我也猜想您想要按最近显示发布日期排序的结果。

    【讨论】:

    • 这应该行得通,谢谢,除了我想按每个播客的历史记录(这是显示其可处置性的另一个字段)这一事实之外。
    • 我刚刚注意到一个小问题:我多次收到同一个播客和不同的相关节目,我相信这是哪里不存在的情况出错了,但我不知道为什么。
    • @johnmalkovitch 。 . .对于每个podcast.id,这应该只返回一个节目——除非两个节目的日期完全相同。要么你在一个播客上有多个名字,要么有多个相同日期的节目。
    • 你说得对,我有相同日期的节目,有没有可以使用的关键字,所以我只需选择一次播客 ID?
    • 如果您想要具有最大值的 id,可以使用 show id 之类的东西来代替 show date。
    【解决方案2】:

    order by 子句中可以有多个用逗号分隔的表达式:

    SELECT r.name AS radio_name,Pod.*,Sh.* 
    FROM podcasts Pod 
      INNER JOIN radios r ON (r.id=Pod.radio_id) 
      INNER JOIN shows Sh ON (Sh.podcast_id=Pod.id) 
    ORDER BY Pod.history, Sh.publication_date LIMIT 5
    ------------- Here -^
    

    【讨论】:

    • 是的,但我想检索 5 个播客(限制 5 个),并且每个播客都有最新的节目。按照您描述的方式进行操作,查询时间超过 1 秒,当它不应该超过 30 毫秒时,这是巨大的,所以出了点问题
    • @johnmalkovitch 关于查询速度,您是否对出现在JOINORDER BY 子句中的所有列都有索引?
    • 速度问题如下:当我执行@Mureinik 告诉的请求时,我收到相同的播客 5 次,这些播客有 5 个不同的节目(减少发布日期)。我想要 5 个不同的播客(按历史排序)和他们的最新节目(按出版日期排序)。
    猜你喜欢
    • 2015-09-22
    • 2013-08-23
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多