2010-09-16 12 views
3

Dire que j'ai cet ensemble de donnéesExiste-t-il une fonction d'agrégation MySQL pour "CONTAINS"?

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

Je veux convertir en une table comme ceci:

 
    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 

J'ai:

 
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 

Ce que je me demande est-ce qu'il y a une meilleure façon de savoir si un champ agrégé contient une valeur, ou si c'est le seul moyen?

Répondre

9

La bonne façon de le faire:

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

Fonctionne à merveille! –

0

Vous ne savez pas combien de groupes vous aurez, mais si c'est un nombre fini je suggère que vous créez une colonne pour chaque groupe ou utilisez le mysql data type SET (masquage de bits).

+0

Il est fini - Je suis en train de passer d'un système à double clé (utilisateur/groupe) à un système de clé unique (utilisateur) avec chaque groupe ayant son propre colonne. – Nick

1

Je suppose que cela est le seul moyen à-dire, GROUP_CONCAT

+0

La seule autre façon que j'ai trouvée est 'SELECT u.user, u1.group, g2.group FROM utilisateurs u utilisateurs LEFT JOIN u1 ON u.user = u1.user AND u1.group =" A "utilisateurs LEFT JOIN u2 ON u.user = u2.user ET u2.group = "B" GROUP BY u.user; ' – Nick

+0

ce n'est pas joli, mais cela peut fonctionner –

0

Je ne sais pas si cela est la façon dont vous faites les choses (comme je suis tout à fait nouveau ici) mais si c'est l'exemple que vous utilisez wouldn Est-il plus facile d'avoir les colonnes user, IN_A, IN_B et IN_C? D'autant plus que cette façon, vous ne seriez pas répéter les données de l'utilisateur à nouveau

+0

Il serait - ce que j'essaie d'atteindre :) L'ensemble de données utilise Utilisateur et groupe en tant que clé PRIMARY à deux colonnes. Je veux pouvoir User la PRIMARY KEY et diviser les groupes en colonnes. – Nick

1

Vous pouvez essayer quelque chose comme cette pièce:

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 fonctionne très bien!