Есть ли в MySQL агрегатная функция для "CONTAINS"? - PullRequest
5 голосов
/ 16 сентября 2010

Скажите, у меня есть этот набор данных

  user  | group
--------+-------
a@a.com |   A
a@a.com |   B
b@b.com |   A
c@c.com |   B
d@d.com |   A
d@d.com |   B
d@d.com |   C

Я хочу преобразовать это в таблицу, подобную этой:

  user  | IN_A  | IN_B  | IN_C
--------+-------+-------+-------
a@a.com | TRUE  | TRUE  | FALSE
b@b.com | TRUE  | FALSE | FALSE
c@c.com | FALSE | TRUE  | FALSE
d@d.com | TRUE  | TRUE  | TRUE

Я получил:

SELECT
  user,
  IF(LOCATE('A', GROUP_CONCAT(group)) > 0, TRUE, FALSE) AS IN_A,
  IF(LOCATE('B', GROUP_CONCAT(group)) > 0, TRUE, FALSE) AS IN_B,
  IF(LOCATE('C', GROUP_CONCAT(group)) > 0, TRUE, FALSE) AS IN_C
FROM users
GROUP BY user

Что мне интересно, так это если есть лучший способ узнать, содержит ли агрегированное поле значение, или это единственный способ?

Ответы [ 5 ]

12 голосов
/ 17 мая 2015

Правильный способ сделать это:

SELECT
   user,
   IF(SUM(group = 'A'), TRUE, FALSE) AS IN_A,
   IF(SUM(group = 'B'), TRUE, FALSE) AS IN_B,
   IF(SUM(group = 'C'), TRUE, FALSE) AS IN_C
FROM users
GROUP BY user
1 голос
/ 26 июля 2012

Вы можете попробовать что-то вроде этого:

SELECT distinct user,  
IF(EXISTS
    (SELECT users_a.user 
        from users as users_a 
    where users_a.group = 'A' and
        users_a.user = users.user), 
TRUE, FALSE) as IN_A,
IF(EXISTS
    (SELECT users_b.user 
        from users as users_b 
    where users_b.group = 'B' and
        users_b.user = users.user), 
TRUE, FALSE) as IN_B,
IF(EXISTS
    (SELECT users_c.user 
        from users as users_c 
    where users_c.group = 'C' and
        users_c.user = users.user), 
TRUE, FALSE) as IN_C
FROM `users` WHERE 1

попробовал здесь отлично работает!

1 голос
/ 16 сентября 2010

Полагаю, это единственный способ, т. Е. GROUP_CONCAT

0 голосов
/ 16 сентября 2010

Я не уверен, что вы так поступаете (я здесь новичок), но если вы используете этот пример, не будет ли проще иметь пользователя столбцов IN_A, IN_B и IN_C? Тем более, что таким образом вы больше не будете повторять пользовательские данные

0 голосов
/ 16 сентября 2010

Не знаю, сколько у вас будет групп, но если это конечное число, я бы посоветовал вам создать столбец для каждой группы или использовать тип данных mysql SET (битовая маскировка).

...