我尝试根据所选的特定语言在单个查询中输出列表。但我需要做的是,如果列表不适用于所选语言,那么如果存在,则返回英语列表。
因此,如果英语为'en'且日语为'jp',则以下内容目前返回日语列表:
SELECT *
FROM listings LS
LEFT JOIN listing_langs LANG ON LS.listing_id = LANG.listing_id
WHERE LANG.language = 'jp'
我试图在MySQL中找出它甚至可以设置查询,以便它首先查找:LANG.language ='jp',并返回日语列表(就像现在一样),但是如果然后空出来寻找:LANG.language ='en'而是返回那个英文列表(如果它存在)。
所以基本上,如果它存在,则返回日语列表,但如果不存在则返回英语列表(如果存在)。
答案 0 :(得分:1)
您可以随时执行以下操作:
SELECT *
FROM listings LS
LEFT JOIN listing_langs LANG ON (LS.listing_id = LANG.listing_id AND LANG.language = 'jp' OR
(NOT EXISTS (SELECT 1 FROM listing_langs WHERE listing_langs.listing_id = LS.listing_id AND listing_langs.language = 'jp') AND LANG.language = 'en')
也就是说,明确检查JOIN以查看jp
是否没有行,如果没有,则使用en
。
这是一个很大的丑陋,但它确实简洁地捕捉了你想要做的事情的本质。
答案 1 :(得分:0)
SELECT *
FROM listings LS
LEFT JOIN listing_langs LANG
ON LS.listing_id = LANG.listing_id
WHERE LANG.language = IFNULL(SELECT language FROM listing_langs WHERE language = 'jp','en')
没有测试(或能够测试)我认为mysql中的IFNULL
命令对此很有用。
答案 2 :(得分:0)
你为什么不这样做
(SELECT *, 1 as grade
FROM listings LS
LEFT JOIN listing_langs LANG ON LS.listing_id = LANG.listing_id
WHERE LANG.language = 'jp')
UNION
(SELECT *, 2 as grade
FROM listings LS
LEFT JOIN listing_langs LANG ON LS.listing_id = LANG.listing_id
WHERE LANG.language = 'en')
ORDER BY grade LIMIT 1
如果存在jp
,则总是只有一行,否则en
如果不存在。
对不起以前的错误。