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?


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);

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.


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);

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.