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”顺序吗?

4

3 回答 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

name 是 '',所以第一个条件是什么时候应该在这里执行,它将执行查询

(从 lang=$default_lang 限制 1 的类别中选择名称)返回名称 apple(因为语言是 'en'),这将被归类为 catname 变量。将在结果中返回

如果它会在第一次获得 name 的值 (id=$current_lang) 它将返回它。

于 2012-09-12T07:09:57.617 回答
2

category.name NULL还是空字符串

如果为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
于 2012-09-12T07:18:51.827 回答
0

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;
于 2012-09-12T09:19:37.590 回答