如何在MySQL中使用JOIN编写正确的If ... Else语句?

时间:2014-02-23 21:05:01

标签: mysql sql

我是MySQL的初学者我只知道完全基本的陈述,但现在我有时间进入一些更困难但更有价值的东西。

我实际上在MySQL中有3个表,这里是表示:

用户:

   user_id | name    | country 
   ---------------------------
         1 | Joseph  | US     
         2 | Kennedy | US      
         3 | Dale    | UK      

管理员:

  admin_id | name    | country
  ----------------------------
         1 | David   | UK     
         2 | Ryan    | US     
         3 | Paul    | UK     

注释:

id | n_id | note                    | comment   | country | type  | manager
----------------------------------------------------------------
 1 | 3    | This is the 1st note    | First     | US      | admin | 2
 2 | 2    | This is the 2nd note    | Second    | US      | user  | 1
 3 | 2    | This is the 3rd note    | Third     | UK      | user  | 2

现在我想执行类似这样的SQL(我将在这里输入不是真正的命令,因为我并不熟悉所有的SQL表达式):

  IF notes.type = admin 
    THEN 
        SELECT 
            notes.note, 
            notes.comment, 
            notes.country, 
            admins.name, 
            admins.country 
        FROM notes, admins 
        WHERE notes.n_id = admin.admin_id
    ELSEIF notes.type = 'user'
        SELECT
            notes.note, 
            notes.comment, 
            notes.country, 
            users.name, 
            users.country 
        FROM notes, users 
        WHERE notes.n_id = users.user_id

我希望你明白我想在这里实现什么。我可以使用更多SQL语句轻松完成此操作,但我想尝试一些不使用那么多资源的查询。


编辑1:

我想获取所有Notes并获取哪个用户组已提交它,而不是将用户的名称应用于它。我的意思是,如果管理员提交了注释,那么SQL应该从Admin表中选择ID(根据类型值),但如果用户提交了注释,它应该从Users表中获取名称。

结果看起来与此类似:

            result:
            ------
                id | note                    | comment  | country | name
                --------------------------------------------------------
                 1 | This is the 1st note    | First    | US      | Paul
                 2 | This is the 2nd note    | Second   | US      | Kennedy 
                 3 | This is the 3rd note    | Third    | UK      | Kennedy 

编辑2:

我实际上忘了提到,所有这些都应该列在经理身上。因此,应在Notes中添加“经理ID”,并列出管理员所在的所有注释:2。

2 个答案:

答案 0 :(得分:3)

如果您希望管理员和用户在一个结果中有多个选项。最简单的方法是使联合选择如下:

SELECT 
    notes.note, 
    notes.comment, 
    notes.country, 
    admins.name, 
    admins.country 
FROM
    notes join admins on notes.n_id = admin.admin_id
WHERE
    notes.manager = 2

UNION ALL

SELECT 
    notes.note, 
    notes.comment, 
    notes.country, 
    users.name, 
    users.country 
FROM
    notes join users on notes.n_id = users.user_id
WHERE
    notes.manager = 2

答案 1 :(得分:3)

以下是您可以在一个查询中执行的方法:

SELECT n.note, n.comment, n.country, 
       coalesce(a.name, u.name) as name, coalesce(a.country, u.country) as country
FROM notes n left join
     admins a
     on n.n_id = a.admin_id and n.type = 'admin' left join
     users u
     on n.n_id = u.user_id and n.type = 'user';

这使用left join将两个表中的记录组合在一起。然后,它会选择select的匹配记录。

要选择特定管理器,请删除分号并添加:

where n.manager = 2;