mysql - 数据库问题 : Fetching a default translation from a table

标签 mysql database

你好,

我有一个 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/

相关文章:

php - 使用 PHP 在 MySql 数据库中查找和打印最常见的值

mysql - 在 Rails 中创建签到时创建/更新位置

php - RasPi上php5与mysql连接错误

database - 如何使用命令行使用凭据连接到 Docker 容器?

php - php mysql 标题中的列名

PHP/MySql 到 javascript 不工作

sql - Oracle Select 语法到 Postgres

database - SQLite 插入速度随着索引数量的增加而变慢

php - 使用数组过滤记录 - Laravel

mysql - 当不存在 max() 时,在 MYSQL 中将 max() 设置为 null