只是最好...查询:)

时间:2015-06-26 03:12:45

标签: mysql performance

tables

当前查询:

SELECT
    a.id,
    IFNULL(c.title, b.title) AS title
FROM
    products a
LEFT JOIN translates b ON a.id = b.product_id
AND b.language_id = 1
LEFT JOIN translates c ON a.id = c.product_id
AND c.language_id = 2

这是工作查询的简化版本。 它的作用:选择所有商品并翻译它们,如果有语言2的翻译(它并不总是存在) - 它是更优选的,但如果没有 - 则语言1(总是翻译成该语言)

是否可以改进此查询?

1 个答案:

答案 0 :(得分:3)

您的查询应该没问题。我会把它写成:

SELECT p.id, COALESCE(t1.title, t1.title) AS title
FROM products p LEFT JOIN
     translates t1
     ON p.id = t1.product_id AND t1.language_id = 1 LEFT JOIN
     translates t2
     ON p.id = t2.product_id AND t2.language_id = 2;

(使用表名称缩写的表别名有助于使查询更容易理解。)

对于性能,您需要translates(product_id, language_id)上的索引。我无法想到另一种编写该查询的方法,我希望它比这个版本更快。