4

categoryという名前の単純なDBテーブルの1つがあります:

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

名前は''なので、ここでいつ実行するかという最初の条件はクエリを実行します

(lang = $ default_lang limit 1であるCategoryから名前を選択します)name appleが返され(言語が'en'であるため)、catname変数に割り当てられます。結果として返されます

初めて名前(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 に答える