2010-09-16 71 views
3

说我有这个数据集“CONTAINS”是否有任何MySQL聚合函数?

 
    user | group 
--------+------- 
[email protected] | A 
[email protected] | B 
[email protected] | A 
[email protected] | B 
[email protected] | A 
[email protected] | B 
[email protected] | C 

我想这个转换成像这样的表:

 
    user | IN_A | IN_B | IN_C 
--------+-------+-------+------- 
[email protected] | TRUE | TRUE | FALSE 
[email protected] | TRUE | FALSE | FALSE 
[email protected] | FALSE | TRUE | FALSE 
[email protected] | 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 

我想知道是否有更好的方法来知道一个聚合字段是否包含一个值,或者如果这是唯一的方法?

回答

9

正确的方法做到这一点:

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 
+0

精美的作品! – 2016-09-14 22:13:11

0

不知道你会有多少组,但如果它有一个finiate数字,我建议你为每个组创建一个列或使用mysql data type SET(位掩码)。

+0

它是有限的 - 我想从一个双密钥(用户/组)系统中的单一密钥(用户)系统,让每个组移到其自己的专栏。 – Nick 2010-09-16 13:23:31

1

我想这是我不知道这是否是你做事情的方式,唯一的办法就是,GROUP_CONCAT

+0

我发现唯一的另一种方式是'SELECT u.user,u1.group,g2.group FROM users u LEFT JOIN users u1 ON u.user = u1.user AND u1.group =“A”LEFT JOIN users u2 ON u.user = u2.user AND u2.group =“B”GROUP BY u.user;' – Nick 2010-09-16 13:25:12

+0

它不漂亮,但它可以工作 – 2012-04-26 22:03:30

0

(因为我很新在这里),但如果这是你使用止跌的例子使列用户,IN_A,IN_B和IN_C更容易吗?特别是因为这样的话,你就不会再重复的用户数据

+0

它会 - 这就是我想要达到的:)数据集使用用户和组作为双列PRIMARY KEY。我想要用户可以使用PRIMARY KEY并将组拆分成列。 – Nick 2010-09-16 13:22:45

1

你可以尝试这样一块:

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 

Tryed here工作正常!