【问题标题】:Sorting results from joins对连接的结果进行排序
【发布时间】:2013-07-26 12:30:59
【问题描述】:

运行此查询时:

SELECT
    a.id,
    pub.name AS publisher_name,
    pc.name AS placement_name,
    b.name AS banner_name,
    a.lead_id,
    a.partner_id,
    a.type,
    l.status,
    s.correctness,
    a.landing_page,
    t.name AS tracker_name,
    a.date_view,
    a.date_action

FROM actions AS a
LEFT JOIN publishers AS pub ON a.publisher_id = pub.id
LEFT JOIN placements AS pc ON pc.publisher_id = pub.id
LEFT JOIN banners AS b ON b.campaign_id = a.campaign_id
LEFT JOIN leads l ON
    l.lead_id = a.lead_id
    AND l.created = (
        SELECT MAX(created) from leads l2 where l2.lead_id = l.lead_id
    )
LEFT JOIN statuses AS s ON l.status = s.status
LEFT JOIN trackers AS t ON t.id = a.tracker_id
LIMIT 10

我可以按actions 表中的每一列进行排序。但是,当我尝试例如ORDER BY b.name(来自banners 表,加入actions.banner_id)或ORDER BY l.lead_id(在更复杂的条件下从leads 加入时,如上所示)MySQL 正在运行查询很长时间(大多数表都有数万条记录)。在性能方面是否可以按连接列排序?

【问题讨论】:

  • 您可以通过添加 where 子句来提高性能,这样您就不会尝试对尽可能多的记录进行排序。
  • @DanBracuk,我认为在这种情况下这是不可能的 - 我想在这里对结果进行排序,而不是过滤它们。
  • 我猜你在应用连接的所有字段中都有索引。也可以试试命令explain 看看查询是如何运行的。
  • 我的猜测(这只是一个猜测)是您的相关子查询正在减慢速度。您知道如何将其重写为不相关的子查询吗?此外,没有 ORDER BY(或者可能是 GROUP BY)的 LIMIT 是毫无意义的。
  • 我不明白您为什么要进行左连接,然后按连接列排序?如果您按列排序,您实际上希望在其中包含一个值。

标签: mysql sql join sql-order-by


【解决方案1】:

您应该在要排序的列所在的表上使用内部联接重写查询。

例如,如果您按actions.banner_id排序

SELECT ...
FROM actions AS a
  JOIN banners AS b ON b.campaign_id = a.campaign_id
  LEFT JOIN  *rest of the query*

除非没有足够的横幅可以加入到操作中以生成总共 10 行,否则您将获得相同的结果。

我猜不是这样,否则你不会在banner_id上排序。

【讨论】:

  • 我不知道这是否会有所帮助。仍然 - 我尝试了它并得到了相同的结果 - 确实取消了“查询运行”。
  • 该列是否有索引?
【解决方案2】:

您可以先在子查询中过滤(排序依据、位置等)您的记录,然后将结果与其余表连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-29
    • 2021-08-25
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    相关资源
    最近更新 更多