Digamos que tengo este set de datos
usuario | grupo -------- + ------- a@a.com | UN a@a.com | segundo b@b.com | UN c@c.com | segundo d@d.com | UN d@d.com | segundo d@d.com | do
Quiero convertir esto en una tabla como esta:
usuario | IN_A | IN_B | Cª -------- + ------- + ------- + ------- a@a.com | VERDADERO | VERDADERO | FALSO b@b.com | VERDADERO | FALSO | FALSO c@c.com | FALSO | VERDADERO | FALSO d@d.com | VERDADERO | VERDADERO | CIERTO
Tengo:
SELECCIONAR usuario, IF (LOCATE ('A', GROUP_CONCAT (grupo))> 0, TRUE, FALSE) COMO IN_A, IF (LOCATE ('B', GROUP_CONCAT (grupo))> 0, TRUE, FALSE) COMO IN_B, IF (LOCATE ('C', GROUP_CONCAT (grupo))> 0, TRUE, FALSE) COMO IN_C FROM usuarios GRUPO POR usuario
Lo que me pregunto es si hay una mejor manera de saber si un campo agregado contiene un valor, o si esta es la única forma.
La forma correcta de hacerlo:
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
Supongo que esta es la única manera, es decir, GROUP_CONCAT
Puedes probar algo como esta pieza:
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
Probado aquí funciona bien!
No estoy seguro de cuántos grupos tendrá, pero si es un número finiate, le sugiero que cree una columna para cada grupo o use el tipo de datos mysql SET (enmascaramiento de bits).
No estoy seguro de si esta es la forma en que haces las cosas (ya que soy bastante nuevo aquí), pero si ese es el ejemplo que estás usando, ¿no sería más fácil tener las columnas de usuario, IN_A, IN_B e IN_C? Especialmente dado que de esa manera no repetiría los datos del usuario nuevamente