你好,
我有一个 MySQL 表 descriptions,其中包含以下字段:lang_id、label、short_description、long_description 和 is_default。
在我的应用程序中,产品描述是根据当前语言从数据库中获取的。目前一切正常,但我想为每个产品添加默认描述,以便在找不到所需语言的描述时,将获取默认描述。
现在,我的请求是这样的:
SELECT
description.id AS record_id
description.label,
description.short_description,
description.long_description
FROM
products,
description,
languages
WHERE
products.id = '.$someProductID.' AND
products.id = description.product_id AND
languages.id = description.lang_id AND
languages.code = "'.$someLang.'"
当所需的翻译不存在时,是否有人有解决方案来获取产品的默认描述?
我想在我的请求中添加一些 IFNULL 语句,如下所示:
IFNULL(description.label, (SELECT label FROM description WHERE product_id = '.$someProductID.' AND is_default = 1) ) AS label
但我对如此复杂的查询不是很熟悉,我无法让它工作。
我愿意接受建议;)
谢谢!
最佳答案
这个:
SELECT p.*, COALESCE (dn.name, den.name) AS cname
FROM products p
LEFT JOIN
description dn
ON dn.product_id = p.id
AND dn.language =
(
SELECT id
FROM language
WHERE code = 'your_language'
)
LEFT JOIN
description den
ON den.product_id = p.id
AND den.is_default
)
WHERE p.id = @my_product
,或者这个:
SELECT p.*,
COALESCE (dn.name,
(
SELECT den.name
FROM description den
WHERE den.product_id = p.id
AND den.is_default
)
) AS cname
FROM products p
LEFT JOIN
description dn
ON dn.product_id = p.id
AND dn.language =
(
SELECT id
FROM language
WHERE code = 'your_language'
)
WHERE p.id = @my_product
在除 MySQL
之外的所有数据库中,当您的语言的翻译很少时,第一个数据库效率更高,当您的语言有很多翻译时,第二个数据库效率更高。
在 MySQL
中,第二个查询(使用 COALESCE
)总是更有效。
请参阅我的博客中有关此问题的系列文章以了解性能详情:
,并进一步导航到其他 RDBMS
关于mysql - 数据库问题 : Fetching a default translation from a table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1323729/