2012-03-16 14 views
48

Mi consulta es:MySQL EN DONDE()

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 una identificación múltiple como 1 y 3, mySQL no devuelve esa fila.

¿Hay alguna manera de obtener esa fila también?

+6

Por favor, publique un ejemplo de las filas que no devuelven correctamente esta consulta. Suponiendo que no está almacenando el 'id' como una lista separada por comas o algo así, varias filas _resolverán_ de su consulta. –

+1

bien, es una lista separada por comas, por ejemplo = my3QL no devolverá mySQL. Veo el problema, se trata de la coma, pero ¿cómo podría hacerlo? – netcase

+0

@ user762683, ¿Utiliza un nombre de perfil adecuado? y ¿cuál es el tipo de datos de este 'id', varchar o set o enum? – Starx

Respuesta

52

Su consulta se traduce en

SELECT * FROM table WHERE id='1' or id='2' or id='3' or id='4'; 

Es sólo devolverá los resultados que coinciden con él.


Una forma de resolverlo evitando la complejidad sería, chaning el tipo de datos a SET. entonces se podría utilizar, FIND_IN_SET

SELECT * FROM table WHERE FIND_IN_SET('1', id); 
+0

No se puede reproducir ningún error. La consulta solicitada funciona para mí. Obtengo TODOS los registros de 'tabla' con los ID listados. –

22

Usted tiene el diseño de bases de datos mal y debe tomar un tiempo para leer algo sobre la normalización de bases de datos (wikipedia/stackoverflow).

que asumen su mesa se ve algo como esto

TABLE 
================================ 
| group_id | user_ids | name | 
-------------------------------- 
| 1  | 1,4,6 | group1 | 
-------------------------------- 
| 2  | 4,5,1 | group2 |  

por lo que en la tabla de grupos de usuarios, cada fila representa un grupo y en user_ids columna que haber un conjunto de identificadores de usuario asignados a ese grupo.

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  | 
---------------------- 
| ...  

A continuación, puede seleccionar fácilmente todos los usuarios con el grupo asignado, o todos los usuarios del grupo, o todos los grupos de usuario, o lo que usted puede pensar de. Además, la 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, será también más fácil de actualizar la base de datos, cuando se desea añadir nueva asignación, simplemente inserta nueva fila en group_user_assignment, cuando se quiere quitar la asignación simplemente elimine la fila en group_user_assignment.

En el diseño de su base de datos, para actualizar las asignaciones, debe obtener su conjunto de tareas de la base de datos, procesarlo, actualizarlo y luego volver a escribir en la base de datos.

Aquí está sqlFiddle para jugar.

Cuestiones relacionadas