代码之家  ›  专栏  ›  技术社区  ›  Tom

查找类别交叉点的最新条目

  •  0
  • Tom  · 技术社区  · 15 年前

    我知道有很多“如何查找最新记录”的问题,但没有一个很好地解决了我的问题:在MySQL中,我试图查找映射到同一表中两个不同类别的条目的最新记录。基本上有一个包含大量信息的条目表、一个CATEGORIES表(id,name)和一个ENTRY-CATEGORIES表(ENTRY-id,category-id)。我需要找到映射到两个不同类别的最新记录。我已经成功地做到了,但实际上只是通过将一个派生表连接到它自己上,感觉有一个更干净的方法来做到这一点。我如何才能更好地表达以下混乱:

    SELECT doc.entry_id
    FROM exp_category_posts doc 
    INNER JOIN exp_category_posts fund ON doc.entry_id = fund.entry_id 
    INNER JOIN exp_weblog_titles t ON doc.entry_id = t.entry_id
    WHERE doc.cat_id = 408 
    AND fund.cat_id = 548 
    AND t.entry_date = (SELECT MAX(t.entry_date)
    FROM exp_category_posts doc 
    INNER JOIN exp_category_posts fund ON doc.entry_id = fund.entry_id 
    INNER JOIN exp_weblog_titles t ON doc.entry_id = t.entry_id
    WHERE doc.cat_id = 408 
    AND fund.cat_id = 548)
    

    这是一个硬编码的例子,408和548通常也是字段。如果你好奇的话,这是一个表达式引擎数据库。

    1 回复  |  直到 15 年前
        1
  •  1
  •   James McNellis    15 年前

    你可以试着替换

    AND t.entry_date = (SELECT MAX(t.entry_date)
    FROM exp_category_posts doc 
    INNER JOIN exp_category_posts fund ON doc.entry_id = fund.entry_id 
    INNER JOIN exp_weblog_titles t ON doc.entry_id = t.entry_id
    WHERE doc.cat_id = 408 
    AND fund.cat_id = 548)
    

    ORDER BY t.entry_date DESC
    LIMIT 1
    

    优化器最终可能会得到一个类似的查询(当然,这并不能保证,但很有可能),但是查询的长度是原来的一半。你得跑了 explain select 查询以查看其性能是否同样或更好。