【问题标题】:MySQL SELECT WHERE within IF statementIF 语句中的 MySQL SELECT WHERE
【发布时间】:2012-10-11 14:31:12
【问题描述】:

我有一个存储用户组的“group_names”表。每个组都有一个管理员,可以是单个用户,也可以由另一个组管理。这目前由 group_names.mgr_type 确定。 INT 值为 1 表示它是单个用户,值 2 表示它是一个管理它的组。

例如,“一般用户”组可以由“IT 部门”组或“John Doe”管理。 users 和 group_names 表上的唯一 ID 字段是“user_id”和“group_id”。

我想从 PHP 中取出逻辑并将其放入 SQL 查询中,但我在这里遇到了问题。鉴于表格布局,我不确定这是否可行,或者我只是无法遵循文档中提供的简单说明。

SELECT gn.group_id, gn.group_name, ... gn.mgr_id, CONCAT(usr.user_firstname,' ',usr.user_lastname) AS created_name, usr.user_id,
CASE gn.mgr_type
    WHEN '1' THEN CONCAT(usr.user_firstname,' ',usr.user_lastname) WHERE usr.user_id=gn.mgr_id LIMIT 1
    WHEN '2' THEN gn.group_name WHERE gn.group_id=gn.mgr_id LIMIT 1
END AS mgr_name
FROM group_names gn 
LEFT JOIN users usr 
ON gn.created_by=usr.user_id 
ORDER BY group_name ASC;

我尝试了 IF 和 CASE 的不同变体,带括号和不带括号,但不断收到“无效语法”错误。

...for the right syntax to use near 'WHERE usr.user_id=gn.mgr_id LIMIT 1) WHEN '2' THEN (gn.group_name WHERE gn' at line 3

我什至可以从同一个表中选择不同的行(根据 mgr_id=group_id 从不同的行中选择 group_name),还是应该添加另一个表? 关于更简单/更有效的方法的任何建议?

谢谢!

【问题讨论】:

    标签: mysql select if-statement case subquery


    【解决方案1】:

    您已经加入了这些表,因此您尝试过吗

    CASE gn.mgr_type
        WHEN '1' THEN CONCAT(mgr_usr .user_firstname,' ',mgr_usr .user_lastname)
        WHEN '2' THEN mgr_grp.group_name
    END AS mgr_name
    

    你实际上还需要 2 个左连接才能工作

    LEFT JOIN users mgr_usr 
       ON gn.mgr_id = mgr_usr.user_id 
    LEFT JOIN group_names mgr_grp
       ON gn.mgr_id = mgr_grp.group_id
    

    如果是用户,则左连接到用户表以获取经理名称;如果是组,则连接到 group_names 表以检索组名

    您可以进一步限制 JOIN

    LEFT JOIN users mgr_usr 
       ON gn.mgr_id = mgr_usr.user_id AND gn.mgr_type = 1
    LEFT JOIN group_names mgr_grp
       ON gn.mgr_id = mgr_grp.group_id AND gn.mgr_type = 2
    

    【讨论】:

    • 感谢您的快速回复,这个解决方案似乎效果最好。
    【解决方案2】:

    我认为你应该尝试这样的事情(尝试在另一个表实例的连接条件中移动位置):

     SELECT gn.group_id, gn.group_name, ... gn.mgr_id,
            CONCAT(usr.user_firstname,' ',usr.user_lastname) AS created_name, 
            usr.user_id,
           CASE gn.mgr_type
             WHEN '1' THEN CONCAT(usr1.user_firstname,' ',usr1.user_lastname)
             WHEN '2' THEN gn1.group_name
          END AS mgr_name
     FROM group_names gn 
     LEFT JOIN users usr 
     ON gn.created_by=usr.user_id
     RIGHT OUTER JOIN users usr1
     ON usr1.user_id=gn.mgr_id LIMIT 1
     OUTER JOIN group_names gn1
     ON usr.user_id=gn1.mgr_id LIMIT 1
     ORDER BY group_name ASC;
    

    【讨论】:

      【解决方案3】:

      试试这个:

      SELECT ...
      CASE WHEN gn.mgr_type = '1' 
          THEN CONCAT(usr.user_firstname,' ',usr.user_lastname) WHERE usr.user_id=gn.mgr_id LIMIT 1
          ELSE gn.group_name WHERE gn.group_id=gn.mgr_id LIMIT 1
          END AS mgr_name
      FROM group_names gn...
      

      【讨论】:

        猜你喜欢
        • 2016-12-29
        • 1970-01-01
        • 1970-01-01
        • 2016-07-20
        • 2021-07-17
        • 2010-12-07
        • 2021-03-13
        • 1970-01-01
        • 2013-09-21
        相关资源
        最近更新 更多