2 votes

MySQL Comment sélectionner plusieurs lignes avec plusieurs colonnes WHERE sur la même table ?

Je veux sélectionner room_id sur la base de la colonne user_id y del

numéro de chambre

nom d'utilisateur

del

1

23

0

1

45

0

1

56

1

25

23

0

25

45

0

25

56

0

Voici un exemple de ma table, et je veux sélectionner room_id WHERE :

"user_id = 23 AND del = 0" (del of the row where user_id=23) 

ET

"user_id = 45 AND del = 0" (del of the row where user_id=45) 

ET

"user_id = 56 AND del = 0" (del of the row where user_id=56) 

La requête ne doit renvoyer que room_id = 25 Comment puis-je réaliser cela avec PHP ou CodeIgniter ?

J'ai essayé de l'utiliser et ça ne marche pas :

$this->db->select()
->from('table')
->where(['user_id' => 23, 'del' => 0])
->where(['user_id' => 45, 'del' => 0])
->where(['user_id' => 56, 'del' => 0])
->get()->result_array();

*Remarques : cela a fonctionné lorsque j'ai essayé d'utiliser des tables jointes sur la même table, mais lorsque j'ai 10 tables jointes, cela a fonctionné. user_id (joindre la même table 10 fois), la requête s'exécute très lentement (car il s'agit d'une grande table avec près d'un million de lignes).

Merci d'avance.

2voto

Salman A Points 60620

Utilisez un where pour filtrer les lignes correspondantes, puis regrouper les résultats et ajouter une clause d'avoir :

SELECT room_id
FROM t
WHERE (user_id = 23 AND del = 0)
OR    (user_id = 45 AND del = 0)
OR    (user_id = 56 AND del = 0)
GROUP BY room_id
HAVING COUNT(*) = 3 -- there are three rows with matching condition for that room

0voto

Aflah vp Points 21

Vous pouvez essayer comme ceci

SELECT room_id
FROM table
WHERE user_id = 23 AND del = 0 AND user_id = 45 AND del = 0 AND user_id = 56 AND del = 0;

La requête peut alors ressembler à ceci

$this->db->select('room_id')
->from('table')
->where(['user_id' => 23, 'del' => 0])
->orWhere(['user_id' => 45, 'del' => 0])
->orWhere(['user_id' => 56, 'del' => 0])
->get()->result_array();

0voto

mark_b Points 454

Vous pouvez soit mettre tous vos user_id entre parenthèses :

SELECT room_id
FROM table
WHERE (user_id = 23 OR user_id = 45 OR user_id = 56) AND del = 0;

ou vous pouvez utiliser le WHERE IN clause :

SELECT room_id
FROM table
WHERE user_id IN (23, 45, 56) AND del = 0;

0voto

Chris Chatman Points 23

"user_id = 23 AND del = 0" ajoutera également l'ID de la salle 1 à l'ensemble des résultats. Ajoutez une condition pour room_id = 25 dans la clause where.

0voto

sukalogika Points 186
SELECT room_id
FROM
(
SELECT `room_id`,`user_id`,`del`,GROUP_CONCAT(user_id ORDER BY user_id ASC) ordered_user
FROM    `my_table`
GROUP BY room_id,del
HAVING ordered_user = "23,45,56" AND del=0
)
AS dbx

Explication :

Vos données :

This is Your Data

Grouper par Room_id et Del Après cela, filtrez par HAVING dans ordered_user After filter by having

Faire un nouveau mannequin pour seulement retourner 25

Optional Step

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X