Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL选择+左连接+如果查询_Mysql_Select_Join_If Statement - Fatal编程技术网

MySQL选择+左连接+如果查询

MySQL选择+左连接+如果查询,mysql,select,join,if-statement,Mysql,Select,Join,If Statement,我有一个名为category的简单DB表: category.id category.name category.lang 1 'apple' 'en' 1 'manzana' 'es' 1 '' 'de' 1 '' 'it' 变量: $default_lang = 'en'; $current_lang = 'it'; 我想根据$current\u

我有一个名为category的简单DB表:

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

$default_lang = 'en';
$current_lang = 'it';
我想根据$current\u lang进行查询,返回category\u name字段,但如果category.name为空,则应使用$default\u 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 <> ''
它工作得很好,但是如果两种语言都有名称值,我应该担心顺序吗

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\u lang

所以在select语句中,它的名称为,所以对于

catname=
    CASE name
             WHEN '' THEN (select name from Category where lang=$default_lang limit 1)
             ELSE name
          END
名称为,所以第一个条件应在何时执行 在这里,它将执行查询

从类别中选择名称,其中lang=$default\u lang limit 1 返回名称apple,因为语言为“en” 这将与catname变量有关。这将在结果中返回

如果它将获得name first time id=$current\u lang的值,它将返回该值。

category.name是NULL还是空字符串

如果为NULL,则use COALESCE返回列表中的第一个非NULL值

如果字符串为空,则使用If

用户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;

请详细说明,以便用户能够更容易地理解代码,因为答案不是回答问题的好方法。有可能在选择中不选择就实现它?因为表category有大约800000行:我确实使用空字符串,但是:IFcategory.name=,$default_lang,category.name name,在category.name的情况下,这只会为'name'字段返回'en'$default_lang?@user1664869 category.name,如果它不是null或空字符串,则会显示它。Johnny,如果是这样的话,你会怎么想:在$curreng\u lang、$default\u lang?@user1664869中,从cat\u list LEFT JOIN category中选择*在cal\u list.id=category.id和category\u lang中加入$curreng\u lang、$default\u lang?@user1664869,它只会显示语言为og en和it的记录,没有其他内容。是的,只有两行可以,一行是当前的,另一行是默认的\u lang,但最后我只需要选择一个category.name
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
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;