Mi consulta es:
SELECT * FROM table WHERE id IN (1,2,3,4);
Lo uso para grupos de usuarios y un usuario puede estar en más de un grupo. pero parece que cuando un registro tiene múltiples ID como 1 y 3, mySQL no devuelve esa fila.
¿Hay alguna forma de conseguir esa fila también?
id
como una lista separada por comas o algo así, varias filas se volverá de su consulta.id
, varchar o set o enum?netcase
lugar de@user762683
?Respuestas:
Tu consulta se traduce en
SELECT * FROM table WHERE id='1' or id='2' or id='3' or id='4';
Solo devolverá los resultados que coincidan con él.
Una forma de resolverlo evitando la complejidad sería cambiar el tipo de datos a
SET
. Entonces podrías usar FIND_IN_SETSELECT * FROM table WHERE FIND_IN_SET('1', id);
fuente
Tiene un diseño de base de datos incorrecto y debería tomarse un tiempo para leer algo sobre la normalización de la base de datos ( wikipedia / stackoverflow ).
Supongo que su mesa se parece a esto
TABLE ================================ | group_id | user_ids | name | -------------------------------- | 1 | 1,4,6 | group1 | -------------------------------- | 2 | 4,5,1 | group2 |
por lo que en su tabla de grupos de usuarios, cada fila representa un grupo y en la
user_ids
columna tiene un conjunto de identificadores de usuario asignados a ese grupo.La versión normalizada de esta tabla se vería así
GROUP ===================== | id | name | --------------------- | 1 | group1 | --------------------- | 2 | group2 | GROUP_USER_ASSIGNMENT ====================== | group_id | user_id | ---------------------- | 1 | 1 | ---------------------- | 1 | 4 | ---------------------- | 1 | 6 | ---------------------- | 2 | 4 | ---------------------- | ...
Luego, puede seleccionar fácilmente todos los usuarios con un grupo asignado, o todos los usuarios del grupo, o todos los grupos de usuarios, o lo que se le ocurra. Además, su consulta SQL funcionará:
/* Your query to select assignments */ SELECT * FROM `group_user_assignment` WHERE user_id IN (1,2,3,4); /* Select only some users */ SELECT * FROM `group_user_assignment` t1 JOIN `group` t2 ON t2.id = t1.group_id WHERE user_id IN (1,4); /* Select all groups of user */ SELECT * FROM `group_user_assignment` t1 JOIN `group` t2 ON t2.id = t1.group_id WHERE t1.`user_id` = 1; /* Select all users of group */ SELECT * FROM `group_user_assignment` t1 JOIN `group` t2 ON t2.id = t1.group_id WHERE t1.`group_id` = 1; /* Count number of groups user is in */ SELECT COUNT(*) AS `groups_count` FROM `group_user_assignment` WHERE `user_id` = 1; /* Count number of users in group */ SELECT COUNT(*) AS `users_count` FROM `group_user_assignment` WHERE `group_id` = 1;
De esta manera, también será más fácil actualizar la base de datos, cuando desee agregar una nueva asignación, simplemente inserte una nueva fila
group_user_assignment
, cuando desee eliminar la asignación, simplemente elimine la filagroup_user_assignment
.En el diseño de su base de datos, para actualizar las asignaciones, tendría que obtener su conjunto de asignaciones de la base de datos, procesarlo y actualizarlo y luego volver a escribir en la base de datos.
Aquí está sqlFiddle para jugar.
fuente
debe tener un registro en la tabla o un registro de matriz en la base de datos.
ejemplo:
SELECT * FROM tabel_record WHERE table_record.fieldName IN (SELECT fieldName FROM table_reference);
fuente
IN (1,2,3,4)
es perfectamente válido. Además, no entiendo cómo esto explica "cuando un registro tiene múltiples ID como 1 y 3, mySQL no devuelve esa fila" en la Pregunta.