mysql - 编写此查询的最佳方式?

标签 mysql join subquery query-optimization inner-join

我正在对另一个表进行子查询连接,因为我希望能够对返回的结果进行排序,我只需要第一行,但我需要它们以某种方式排序,这样我就可以得到最低 ID。

我尝试添加 LIMIT 1 但完整查询返回 0 个结果;所以现在它没有限制,在 EXPLAIN 中,我有两行显示它们正在使用 auction_media 表的完整 10k+ 行。

我这样写是为了避免必须单独查询每一行的auction_media表,但现在我认为如果必须使用整个auction_media,这种方式并不是那么好表?

哪种方式更好?我的方式还是单独查询 auction_media 表? ...或者有更好的方法吗!?

这是代码:

SELECT 
    a.auction_id,
    a.name,
    media.media_url
FROM 
    auctions AS a 
    LEFT JOIN users AS u ON u.user_id=a.owner_id 
    INNER JOIN ( SELECT media_id,media_url,auction_id 
                         FROM auction_media 
                         WHERE media_type=1 
                          AND upload_in_progress=0 
                         ORDER BY media_id ASC
            ) AS media 
            ON a.auction_id=media.auction_id 
WHERE a.hpfeat=1 
  AND a.active=1 
  AND a.approved=1 
  AND a.closed=0 
  AND a.creation_in_progress=0 
  AND a.deleted=0 
  AND (a.list_in='auction' OR u.shop_active='1') 
GROUP BY a.auction_id;

编辑:通过我的测试,使用上面的查询似乎总体上是更快的方法;但是我担心当 auction_media 表增长到 100 万行之类的时候,情况是否仍然如此。

最佳答案

编辑:如评论中所述 - 不需要 DISTINCT,因为拍卖表只能与(最多)一个用户表行和内部查询中的一行关联。

您可能想尝试一下。 外部查询的 GROUP BY 被替换为 DISTINCT,因为您没有任何聚合函数。 内部查询被替换为查找每个拍卖 ID 最小的 media_id 的查询,然后 JOINed 返回以获取 media_url 。 (由于我不知道 media_id 和 racing_id 是否是复合唯一键,因此我使用相同的 WHERE 子句来帮助消除潜在的重复项。)

SELECT
    a.auction_id,
    a.name,
    auction_media.media_url
FROM auctions AS a 
LEFT JOIN users AS u 
  ON u.user_id=a.owner_id 
INNER JOIN (SELECT auction_id, MIN(media_id) AS media_id
            FROM auction_media 
            WHERE media_type=1 
               AND upload_in_progress=0 
            GROUP BY auction_id) AS media 
  ON a.auction_id=media.auction_id 
INNER JOIN auction_media
  ON auction_media.media_id = media.media_id
    AND auction_media.auction_id = media.auction_id
    AND auction_media.media_type=1 
    AND auction_media.upload_in_progress=0 
WHERE a.hpfeat=1 
  AND a.active=1 
  AND a.approved=1 
  AND a.closed=0 
  AND a.creation_in_progress=0 
  AND a.deleted=0 
  AND (a.list_in='auction' OR u.shop_active='1');

关于mysql - 编写此查询的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22333805/

相关文章:

php - MYSQL utf8 日期、日期时间、int 排序规则

MySQL 检查逗号分隔值是否与表中的行匹配

sql - 在子查询中使用 DISTINCT 时如何重写子查询以使用连接?

mysql - 连接两个表以获取计数

mysql - 全文搜索索引独立于表

mysql - 加入mysql中表之间的差异

SQL - 如果加入期间日期不匹配 - 更改日期然后加入

mysql - 我希望使用 MySql 优化此查询

MySQL 子查询 - 获取最新的时间戳记录并提取字段

mysql - 如果数据存在于另一个表中,则从巨大的 MySQL 表中删除