Sélectionner et Supprimer en une seule requête
J'ai 2 tables:
- utilisateurs (user_id, user_connected)
- chambres (room_id, room_initiating_user_id, room_target_user_id)
Je voudrais supprimer tous les "chambres" ayant à la fois le lancement de l'utilisateur et le target_user réglé sur "user_connected=0"
J'ai deux problèmes ici:
- Comment cibler ces utilisateurs?
Évidemment, cette requête ne fonctionne pas:SELECT room_id FROM rooms,users WHERE ( (room_target_user_id=user_id) AND (user_connected=0) ) AND ( (room_initiating_user_id=user_id) AND (user_connected=0) )
- Je voudrais, avec la même requête, si possible, de supprimer ces chambres (pas de problème si j'utilise une deuxième requête, mais cela signifie que cette requête serait déclenché pour chaque résultat, ce qui est beaucoup. N'est-il pas possible de supprimer ces chambres à la fois?
OriginalL'auteur Baylock | 2012-05-08
Vous devez vous connecter pour publier un commentaire.
J'ai été heureux de vous aider. Aussi, si vous êtes sûr que votre user_id est unique dans la table des utilisateurs, j'ai encore la solution la plus simple.
J'ai édité ma réponse, pour offrir une solution de rechange pour le cas où le user_id est unique dans la table des utilisateurs.
Mon id sont tous uniques (incrémentation automatique), quelle que soit la table de cette application. Je suis tous les yeux et les oreilles pour une solution plus simple (pour tous les autres participants, veuillez considérer que je vais étudier toutes vos réponses, car il y a aussi de très interressant, merci)
êtes-vous sûr que la solution la plus simple qui fonctionne? Pour moi, il semble que vous ne supprimez que les chambres où l'initiateur et la cible sont les mêmes utilisateurs.
OriginalL'auteur Lajos Arpad
Pour cibler les utilisateurs, vous devez
JOIN
tableusers
deux fois, une fois pour le lancement de l'utilisateur, et un autre pour l'utilisateur cible:De supprimer ces chambres, vous pouvez utiliser le haut comme une sous-requête:
Vous ne pouvez pas supprimer à partir d'une table et de sélectionner à partir de la même table dans une sous-requête.
Muns: Oui vous pouvez, si vous utilisez des alias de table. bfavaretto utilisé l'alias chambre pour les chambres de la table. Vous pouvez le tester à tout moment par la création de ces tableaux, en les remplissant avec les lignes et les exécuter bfavaretto de la requête. Il va travailler, mais il sera trop lente à mon avis.
c'est intéressant, j'ai tendance à privilégier des jointures au lieu de sous-requêtes pour des raisons de performances. Étant autodidacte, et je n'ai jamais vraiment compris le big-o de la notation, mais je vais vraiment regarder dans ce en outre! Merci pour votre commentaire!
Merci beaucoup bfvaretto pour votre aide. Si vous n'avez pas l'esprit, je vais aller pour la plus simple de la requête donnée par Lajos Arpad.
OriginalL'auteur bfavaretto
D'abord, sélectionnez l'une de ces chambres, vous aurez besoin de se joindre à la table des utilisateurs deux fois:
Note: L'utilisation de deux alias de la table des utilisateurs, de manière à différencier les deux jointures. Aussi, je' l'aide de la syntaxe de JOINTURE, plutôt que les plus âgés par des virgules jointures qui sont découragés
Pour supprimer les chambres, vous aurez besoin d'un multi-table delete:
Merci beaucoup Ezequiel Muns pour votre aide. Si vous n'avez pas l'esprit, je vais aller pour la plus simple de la requête donnée par Lajos Arpad.
En effet. La SUPPRESSION de la r dit à la requête de seulement supprimer les lignes dans les chambres, ne pas toucher les lignes jointes dans les utilisateurs. Pour info: dev.mysql.com/doc/refman/5.1/en/delete.html
Oui, vous êtes ici.
OriginalL'auteur Ezequiel Muns