MySQL查询语句:SELECT + LEFT JOIN + IF。

4

我有一个简单的数据库表叫做“category”:

category.id category.name category.lang
1           'apple'       'en'
1           'manzana'     'es'
1           ''            'de'
1           ''            'it'

变量:

$default_lang = 'en';
$current_lang = 'it';

我想要创建一个查询,根据$current_lang返回category_name字段,但如果category.name为空,则应该使用$default_lang中的category.name,如下所示:
SELECT * FROM cat_list
    LEFT JOIN category ON cal_list.id = category.id
          AND IF(category.name = $current_lang = '', $default_lang, 'No Lang')

请告诉我,我该如何修复这个查询以使它正常工作?

===

好的,现在我有一个很好的想法:

SELECT * FROM cat_list LEFT JOIN category 
           ON cal_list.id = category.id 
          AND category_lang IN ($curreng_lang, $default_lang)
          AND category_name <> ''

它的工作正常,但是如果两种语言都有名称值,我应该担心“IN”顺序吗?

3个回答

3
SELECT catname=
CASE name
         WHEN '' THEN (select name from Category where lang=$default_lang limit 1)
         ELSE name
      END
FROM Category where id=$current_lang

说明: 这里的查询语句在select语句中使用了case语句, 其中 外部查询使用条件“id=$current_lang”
因此,在select语句中它将有name='',所以
catname=
    CASE name
             WHEN '' THEN (select name from Category where lang=$default_lang limit 1)
             ELSE name
          END

名称为空,因此当满足第一个条件时应执行以下查询:

(选择语言为$default_lang的类别中的名称,限制为1条记录) 名称苹果被返回(因为语言是'en') 并将存储到catname变量中。它将在结果中返回。

如果首次以id=$current_lang获取名称的某个值,则会将其返回。


1
仅以代码作为答案并不是一个好的回答方式。 - user1280616
Patriks,能否在不使用SELECT IN SELECT的情况下实现它?因为类别表有大约800,000行 :( - Ken Tang

2

category.nameNULL还是空字符串?

如果是NULL,使用COALESCE返回列表中第一个非NULL值

SELECT category.id, 
       COALESCE(category.name, $default_lang) name,
       COALESCE(category.lang, $current_lang) lang
FROM cat_list
     LEFT JOIN category 
           ON cal_list.id = category.id

如果是空字符串,使用 IF
SELECT category.id, 
       IF(category.name = '', $default_lang,category.name) name,
       IF(category.lang = '', $current_lang,category.lang) lang
FROM cat_list
     LEFT JOIN category 
           ON cal_list.id = category.id

我确实使用空字符串,但是:如果(category.name = '', $default_lang,category.name) name,这只会在category.name <> ''的情况下为'name'字段返回'en' ($default_lang)。 - Ken Tang
如果 category.name 不为 null 或空字符串,则会显示它。 - John Woo
Johnny,你认为这样做怎么样:SELECT * FROM cat_list LEFT JOIN category ON cal_list.id = category.id AND category_lang IN ($curreng_lang, $default_lang)? - Ken Tang
@user1664869 这将仅显示具有语言 og enit 的记录,没有其他内容。 - John Woo
是的,只需要两行代码,一行是当前语言,另一行是默认语言。但最终我需要选择一个类别名称不等于''的语言。 - Ken Tang

0

用户1664869,这个怎么样?

SELECT catname=CASE c1.name
       WHEN '' THEN c2.name
       ELSE c1.name
       END
FROM
Category c1
INNER JOIN Category c2 ON c1.lang=$current_lang and c2.lang=$default_lang;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接