sql—如何在mysql的其他表中查看一个id是否有某个值

xfyts7mz  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(353)

我想知道某个id是否开启了某个功能。但函数在另一个表中。
表1:

userID Name
     1 aaa
     2 bbb
     3 ccc

表2:

functionID useID
         1     1
         2     1
         2     2
         3     2
         1     3
         3     3

表3

userID Name function1Enabled function2Enabled function3Enabled
     1 aaa  True             True             False
     2 bbb  False            True             True 
     3 ccc  True             False            True
thigvfpy

thigvfpy1#

你可以试着用 JOIN 带条件聚合函数

create table Table1(
   userID int,
  Name varchar(50)
);

insert into Table1 values (1,'aaa');
insert into Table1 values (2,'bbb');
insert into Table1 values (3,'ccc');

create table Table2(
   functionID int,
  userID int
);

insert into Table2 values (1,1);
insert into Table2 values (2,1);
insert into Table2 values (2,2);
insert into Table2 values (3,2);
insert into Table2 values (1,3);
insert into Table2 values (3,3);

查询1:

SELECT  t1.userID,
        t1.Name,
        IFNULL(MAX(CASE WHEN t2.functionID = 1 then 'true' end),'false') function1Enabled,
        IFNULL(MAX(CASE WHEN t2.functionID = 2 then 'true' end),'false') function2Enabled,
        IFNULL(MAX(CASE WHEN t2.functionID = 3 then 'true' end),'false') function3Enabled
FROM 
Table1 T1  
LEFT JOIN Table2 t2 ON t2.userID = T1.userID
GROUP BY t1.userID,
        t1.Name

结果:

| userID | Name | function1Enabled | function2Enabled | function3Enabled |
|--------|------|------------------|------------------|------------------|
|      1 |  aaa |             true |             true |            false |
|      2 |  bbb |            false |             true |             true |
|      3 |  ccc |             true |            false |             true |
mf98qq94

mf98qq942#

SELECT t1.userID, t1.Name
   , CASE WHEN COUNT(CASE WHEN t2.functionID = 1 THEN 1 ELSE NULL END) > 0 THEN 'True' ELSE 'False' END AS function1Enabled
   , CASE WHEN COUNT(CASE WHEN t2.functionID = 2 THEN 1 ELSE NULL END) > 0 THEN 'True' ELSE 'False' END AS function2Enabled
   .... and so on
FROM table1 AS t1
LEFT JOIN table2 AS t2 ON t1.userID = t2.userID
GROUP BY t1.userID, t1.Name
;

笔记:
聚合函数(如count)忽略空值。 ELSE NULL 实际上不需要;如果没有 ELSE 在一个 CASE 这可以缩短使用 IF() 而不是 CASE ,但case对其他rdbms更具可移植性。
这个 LEFT JOIN 将确保您获得所有表1记录,即使它们没有Map到表2中的函数。
不,没有特殊的语法来获取为每个函数id值动态创建的“functionEnabled”结果字段;如果您添加一个新的函数id,这种查询将需要修改。

相关问题