Wählen Sie und Löschen Sie mit einer einzigen Abfrage
Ich habe 2 Tabellen:
- Benutzer (user_id, user_connected)
- Zimmer (room_id, room_initiating_user_id, room_target_user_id)
Ich würde gerne alle löschen "Raum" müssen sowohl der initiierende Benutzer und das target_user "user_connected=0"
Habe ich zwei Probleme:
- Wie Ziel diese Nutzer?
Offensichtlich kann diese Abfrage funktioniert nicht: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) )
- Möchte ich mit der gleichen Abfrage, wenn möglich, löschen Sie diese Zimmer (kein problem, wenn ich eine zweite Abfrage, aber es bedeutet, dass diese Abfrage würde ausgelöst werden, die für jedes Ergebnis, das ist viel. Ist es nicht möglich, löschen Sie diese Zimmer auf einmal?
InformationsquelleAutor Baylock | 2012-05-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich war glücklich, zu helfen. Auch, wenn Sie sicher sind, dass Ihre Benutzerkennung ist einmalig in der Tabelle Benutzer habe ich eine noch einfachere Lösung.
Ich habe bearbeitet meine Antwort, eine alternative für den Fall, wenn user_id ist einzigartig in der Benutzer-Tabelle.
Meine id ' s sind alle einzigartig (autoincrement), was die Tabelle von dieser app. Ich bin alle Augen und Ohren nach einer einfacheren Lösung (für alle die oher Teilnehmer, bitte beachten Sie, dass ich studieren werde allen Antworten, da es auch sehr interressant, danke)
sind Sie sicher, dass die einfachere Lösung funktioniert? Für mich sieht es aus wie Sie sind nur das löschen von Räumen, in denen die Einleitung und Ziel sind die gleichen user.
InformationsquelleAutor Lajos Arpad
Ziel für die Benutzer, die Sie benötigen, um
JOIN
Tabelleusers
zweimal, einmal für die initiierende Benutzer und ein weiteres für das Ziel Benutzer:Löschen Sie diejenigen Zimmer, die Sie verwenden können, die oben als Unterabfrage:
Sie können nicht löschen aus einer Tabelle und wählen Sie aus der gleichen Tabelle in einer Unterabfrage.
Muns: ja, Sie können, wenn Sie die Verwendung von Tabellen-Aliase. bfavaretto verwendet den alias-Zimmer für Zimmer-Tabelle. Sie können den test jederzeit durch das erstellen dieser Tabellen, die Sie mit Zeilen und führen Sie bfavaretto die Abfrage. Es wird funktionieren, aber es wird zu langsam meiner Meinung nach.
das ist interessant, ich Neige zu bevorzugen anstelle von Unterabfragen joins aus performance-Gründen. Ein selbst Lernender, und ich habe nie wirklich verstanden, die big-o-notation, aber ich werde auf jeden Fall schauen in diese weitere! Danke für deinen Kommentar!
Vielen Dank bfvaretto für Ihre Hilfe. Wenn Sie nichts dagegen haben, werde ich gehen für die einfachste Abfrage gegeben, die von Lajos Arpad.
InformationsquelleAutor bfavaretto
Erste, wählen Sie diese Zimmer, Sie müssen sich auf die Benutzer-Tabelle zweimal:
Hinweis: Die Verwendung von zwei unterschiedlichen Aliasnamen für die Tabelle Benutzer, so unterscheiden sich die beiden verbindet. Außerdem, ich' mithilfe der JOIN-syntax, eher als die älteren Komma-joins, die entmutigt
Löschen der Zimmer, müssen Sie ein multi-table delete:
Vielen Dank Ezequiel Muns für Ihre Hilfe. Wenn Sie nichts dagegen haben, werde ich gehen für die einfachste Abfrage gegeben, die von Lajos Arpad.
Funktioniert in der Tat. Der DELETE-r sagt die Abfrage nur die Zeilen löschen in den Zimmern, nicht zu berühren die verknüpften Zeilen der Benutzer. FYI: dev.mysql.com/doc/refman/5.1/en/delete.html
Ja, Sie sind hier genau richtig.
InformationsquelleAutor Ezequiel Muns