简体   繁体   English

MySQL SELECT + LEFT JOIN + IF查询

[英]MySQL SELECT + LEFT JOIN + IF query

I have one of simple DB tables named category: 我有一个名为category的简单数据库表:

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

Variable: 变量:

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

I would like to make query that returns category_name field according to $current_lang, but if category.name is empty then should use category.name from $default_lang like this: 我想根据$ 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')

Please let me know, how could i fix this query to make it work? 请让我知道,我如何修复此查询以使其工作?

=== ===

Ok now I have a good Idea: 好的,我现在有个好主意:

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

it works fine but should I worry about the "IN" order in case if both languages has name values? 它工作正常,但如果两种语言都有名称值,我应该担心“IN”顺序吗?

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

Explaination: here Query is using case statement inside select statment, where outer query is using condition "id=$current_lang" 解释:这里Query在select statment中使用case语句,其中外部查询使用条件“id = $ current_lang”

so in select statement it will have name='', so for 所以在select语句中它将具有name ='',所以对于

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

name is '', so first condition with when should execute here it will execute query name是'',所以第一个条件是什么时候应该在这里执行它将执行查询

(select name from Category where lang=$default_lang limit 1) name apple is returned (because language is 'en') and that will be sotred to catname variable. (从类别中选择名称,其中lang = $ default_lang limit 1)返回名称apple(因为语言为'en'),并且将被标记为catname变量。 which will be returned in result 将在结果中返回

If it will get value with something for name first time (id=$current_lang) it will return with it. 如果它第一次获得名称的值(id = $ current_lang),它将返回它。

Is the category.name NULL or empty string ? category.name NULL还是空字符串

If NULL , use COALESCE ( Returns the first non-NULL value in the list ) 如果为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 Empty String , Use IF 如果是空字符串 ,请使用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

user1664869, what about this? user1664869,这个怎么样?

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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM