检查SQL中是否存在值,如果不返回另一行

时间:2011-10-10 20:44:46

标签: mysql sql join

我有一个选择产品和文本翻译的MySQL SQL查询:

SELECT *
FROM (select * from products) p
LEFT JOIN (SELECT * FROM translations) t
ON t.id = p.product_id

这会从数据库中获取产品。但它会抓取所有可用的翻译。我只想获得当前语言的翻译。所以我可以用这个:

SELECT *
FROM (select * from products) p
LEFT JOIN (SELECT * FROM translations WHERE lang = 'en') t
ON t.id = p.product_id

这是按预期工作的,但并非所有产品都有每种语言的翻译。我最终想要做的是指定一种语言,如果没有给定的翻译,则返回我们所拥有的其他翻译。这可以在SQL中完成,还是需要在PHP中迭代结果?

2 个答案:

答案 0 :(得分:2)

如果您为每个产品创建“默认”语言翻译,并为其提供代码'zz',则以下内容将起作用。每个产品都必须有'zz'翻译。

(这花了我一个小时,但我在这个过程中学到了很多东西 - 很棒的问题!)。

SELECT *
FROM products p
LEFT JOIN translations t
ON (p.id == t.product_id
    AND (t.lang == 'en'
         OR (t.lang == 'zz' AND
             'en' NOT IN
             (SELECT `lang` FROM translations t2 WHERE t2.product_id == p.id)
            )
        )
   );

抱歉,如果效率不高。你需要尝试一下才能看到。

答案 1 :(得分:0)

一种方法是添加另一个LEFT JOIN,用于提取该产品ID的任何语言的第一个翻译。如果第一个翻译(使用所需语言)不可用,请使用COALESCE语句来使用二级翻译:

SELECT
    p.product_id,
    COALESCE(t.lang, t2.lang),
    COALESCE(t.translation, t2.translation)
FROM (select * from products) p
LEFT JOIN (SELECT * FROM translations WHERE lang = @lang) t
    ON t.id = product_id
LEFT JOIN (SELECT * FROM translations
    WHERE lang = (SELECT min(lang) FROM translations
        WHERE t3.id = t2.id))
    t2 ON t2.id = p.product_id;

演示:http://www.sqlize.com/46Q73VJW24