美好的一天,
我有一个MySQL表描述,其中包含字段: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.*,(
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)总是效率更高.
> Fallback language names: Oracle
,并进一步浏览其他RDBMS的