【问题标题】:mysql syntax for IFNULL with subquery带有子查询的 IFNULL 的 mysql 语法
【发布时间】:2014-11-12 10:21:41
【问题描述】:

我想在IFNULL 语句中使用子查询

SELECT t.col1
     , IFNULL(t.col2, (SELECT an.col_11
                       FROM another_table an
                       WHERE an.col1 = t.col5)) as alias_name
     , t.col3
FROM table t;

IFNULL 语句中的第二个表达式应该是子查询。

请给我正确的语法 我的实际查询是

SELECT u.username, up.gender, d.name, desg.name, 
IFNULL(up.creative_lead_id, 
    (SELECT au.username FROM auth_user au 
     WHERE au.id=up.creative_lead_id)) as creative_lead, up.image 
FROM user_profile up, department d, designation, auth_user 
WHERE up.department_id=d.id 
AND up.designation_id = desg.id up.auth_uesr_id = u.id;

由于 IFNULL 语句,此查询给出语法错误。

【问题讨论】:

    标签: mysql ifnull


    【解决方案1】:

    在这种情况下不要使用子查询,而是尝试这样的查询(使用关节):

    SELECT t.col1
        ,IFNULL(t.col2, an.col_11) AS alias_name
        ,t.col3
    FROM your_table t
    LEFT JOIN another_table an ON an.col1 = t.col5
    

    在您的完整查询中,您对 IFNULL 子句使用了两次 up.creative_lead_id(一次作为第一个参数,然后在子查询中)。这是没有意义的,因为如果第一个参数是 NULL,您的子查询将不会返回任何结果!

    为了向您展示可以解决您的问题的原理,我只是将第一个参数替换为我称为up.creative_lead 的虚构参数。这个虚构的列是存储在您的表user_profile 中的创意线索的名称,如果此值为空,我正在查找与creative_lead_id 对应的用户的username

    以下是完整的查询,可以通过上述更正解决您的问题:

    SELECT u.username
        ,up.gender
        ,d.name
        ,desg.name
        ,IFNULL(up.creative_lead, cl.username) AS creative_lead
        ,up.image
    FROM user_profile up
    INNER JOIN department d ON d.id = up.department_id
    INNER JOIN designation desg ON desg.id = up.designation_id
    INNER JOIN auth_user u ON u.id = up.auth_user_id
    INNER JOIN auth_user cl ON cl.id = up.creative_lead_id
    

    请注意,我更改了您查询的语法,强烈建议避免使用旧语法来处理接缝(改用显式 JOIN 子句)。

    希望这会对你有所帮助。

    【讨论】:

    • 感谢您的解决方案,但我的查询在 FROM 和 WHERE 子句中包含多个表,还有它们的 then 我应该如何编写此查询
    • 向我们提供整个查询,我们将帮助您找到最佳解决方案。不管有多少表和条件,要想得到你想要的结果,最好的解决方案是使用联结(使用子查询会影响性能,因为子查询会针对每一行执行!)
    • 查询如下,SELECT u.username, up.gender, d.name, desg.name, IFNULL(up.creative_lead_id, (SELECT au.username FROM auth_user au WHERE au.id=up .creative_lead_id)) 作为 creative_lead, up.image FROM user_profile up, 部门 d, 名称, auth_user WHERE up.department_id=d.id AND up.designation_id = desg.id up.auth_uesr_id = u.id;请给我适当的解决方案。提前致谢。
    • @Mugdha 请在您的问题中添加此信息,它会更容易帮助您
    【解决方案2】:

    您可以使用 join 重写您的查询,相关查询将对表中的每一行执行,它可能会影响性能

    SELECT 
      t.col1,
      IFNULL(t.col2, an.col_11) AS alias_name,
      t.col3 
    FROM
      `table` t 
      LEFT JOIN another_table an 
        ON an.col1 = t.col5 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-21
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多