【问题标题】:MySQL SELECT + LEFT JOIN + IF queryMySQL SELECT + LEFT JOIN + IF 查询
【发布时间】:2012-09-05 03:44:22
【问题描述】:

我有一个名为 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”顺序吗?

【问题讨论】:

    标签: mysql select join if-statement


    【解决方案1】:
    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
    

    说明: 这里 Query 在 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 的类别中选择名称) 返回名称苹果(因为语言是'en') 这将被归类为 catname 变量。将在结果中返回

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

    【讨论】:

    • 请详细说明,以便用户可以更容易地理解只有代码,因为答案不是回答的好方法
    • Patriks,是否可以在 SELECT 中不使用 SELECT 来实现它?因为表类别大约有 800,000 行 :(
    【解决方案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
    

    【讨论】:

    • 我确实使用了空字符串,但是: IF(category.name = '', $default_lang,category.name) name,这将只返回 'en' ($default_lang) for 'name' 字段如果是 category.name '' ?
    • @user1664869 category.name 如果不是 null 或空字符串,将被显示。
    • 约翰尼,你觉得如果把它变成这样:SELECT * FROM cat_list LEFT JOIN category ON cal_list.id = category.id AND category_lang IN ($curreng_lang, $default_lang) ?
    • @user1664869 只会显示语言为 og enit 的记录,仅此而已。
    • 是的,只有两个 2 行是可以的,一个是 current_lang 另一个是 default_lang,但最后我只需要选择一个 category.name ''
    【解决方案3】:

    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;
    

    【讨论】:

      猜你喜欢
      • 2015-02-22
      • 2014-09-27
      • 1970-01-01
      • 2019-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多