MySQL Conditional Where子句

时间:2010-11-19 16:31:00

标签: mysql

我尝试根据所选的特定语言在单个查询中输出列表。但我需要做的是,如果列表不适用于所选语言,那么如果存在,则返回英语列表。

因此,如果英语为'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'而是返回那个英文列表(如果它存在)。

所以基本上,如果它存在,则返回日语列表,但如果不存在则返回英语列表(如果存在)。

3 个答案:

答案 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如果不存在。

对不起以前的错误。