MySQL WHERE IN ()

Ma requête est la suivante:

SELECT * FROM table WHERE id IN (1,2,3,4); 

Je l’utilise pour les groupes d’utilisateurs et un utilisateur peut être dans plus d’un groupe. mais il semble que lorsqu’un enregistrement a plusieurs identifiants comme 1 et 3, mySQL ne renvoie pas cette ligne.

Y a-t-il un moyen d’obtenir cette ligne aussi?

Votre requête se traduit par

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

Il ne renverra que les résultats correspondants.


Une façon de le résoudre en évitant la complexité serait de changer le type de données en SET . Ensuite, vous pourriez utiliser, FIND_IN_SET

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

Vous avez une mauvaise conception de la firebase database et vous devriez prendre le temps de lire quelque chose sur la normalisation de la firebase database ( wikipedia / stackoverflow ).

Je suppose que votre table ressemble un peu à ceci

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

Ainsi, dans votre tableau de groupes d’utilisateurs, chaque ligne représente un groupe et dans la colonne user_ids , vous avez un ensemble d’ID utilisateur affecté à ce groupe.

La version normalisée de cette table ressemblerait à ceci

 GROUP ===================== | id | name | --------------------- | 1 | group1 | --------------------- | 2 | group2 | GROUP_USER_ASSIGNMENT ====================== | group_id | user_id | ---------------------- | 1 | 1 | ---------------------- | 1 | 4 | ---------------------- | 1 | 6 | ---------------------- | 2 | 4 | ---------------------- | ... 

Ensuite, vous pouvez facilement sélectionner tous les utilisateurs avec le groupe assigné, ou tous les utilisateurs du groupe, ou tous les groupes d’utilisateurs, ou tout ce que vous pouvez penser. En outre, votre requête SQL fonctionnera:

 /* 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 cette façon, il sera également plus facile de mettre à jour la firebase database, lorsque vous souhaitez append une nouvelle affectation, il vous suffit d’insérer une nouvelle ligne dans group_user_assignment .

Dans la conception de votre firebase database, pour mettre à jour les affectations, vous devez obtenir votre jeu d’affectation à partir de la firebase database, le traiter et le mettre à jour, puis le réécrire dans la firebase database.

Voici sqlFiddle avec lequel jouer.