MySQL DONDE EN ()

84

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?

netcase
fuente
7
Publique un ejemplo de las filas que no regresan correctamente de esta consulta. Suponiendo que no está guardando el idcomo una lista separada por comas o algo así, varias filas se volverá de su consulta.
Michael Berkowski
1
bueno, es una lista separada por comas, por ejemplo => 3,4 no será devuelto por mySQL. Veo el problema, se trata de la coma, pero ¿cómo podría hacerlo?
netcase
1
@ user762683, ¿utiliza un nombre de perfil adecuado? y ¿cuál es el tipo de datos de esto id, varchar o set o enum?
Starx
1
@Starx ¿Qué asunto tuyo es el nombre de perfil que alguien usa?
Michael Berkowski
1
@Michael, vea ¿Qué tan fácil y correcto es que los sonidos correspondan al OP como en netcaselugar de @user762683?
Starx

Respuestas:

82

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_SET

SELECT * FROM table WHERE FIND_IN_SET('1', id);
Starx
fuente
No se puede reproducir ningún error. La consulta solicitada funciona para mí. Obtengo TODOS los registros de la 'tabla' con los identificadores enumerados.
BF
39

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_idscolumna 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 fila group_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.

Buksy
fuente
1

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);
misbah dino
fuente
No se requiere una subselección. 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.
Scratte