Как узнать, имеет ли идентификатор определенное значение в другой таблице в MySQL - PullRequest
0 голосов
/ 24 августа 2018

Я хочу знать, включена ли для определенного идентификатора определенная функция.но функции находятся в другой таблице.

Таблица 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

Ответы [ 2 ]

0 голосов
/ 24 августа 2018
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, игнорируют значения NULL.
  • ELSE NULL фактически не требуется; это подразумевается, если нет ELSE в CASE
  • Это можно сократить, используя IF() вместо CASE, но CASE более переносим для других СУБД.
  • LEFT JOIN гарантирует, что вы получите все записи таблицы1, даже если у них нет функций, сопоставленных с таблицей 2.
  • Нет, нет специального синтаксиса для динамического создания полей результатов "functionNEnabled" для каждого значения идентификатора функции; если вы добавите новый идентификатор функции, этот вид запроса нужно будет изменить.
0 голосов
/ 24 августа 2018

Вы можете попытаться использовать 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 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...