3 Stimmen

MYSQL-Anweisung

Ich möchte Benutzer auswählen, die die gleiche city_id und country_id wie der aktuelle Benutzer haben.

Ich habe Land und Stadt aus Gründen der Flexibilität absichtlich unabhängig voneinander sein lassen.

Sieht es etwa so aus?

SELECT id, country_id, city_id, surname FROM users WHERE 
   country_id = (SELECT id,country_id FROM users WHERE id = 'current_user') AND 
   city_id = (SELECT id, city_id FROM users WHERE id = 'current_id')

Irgendwelche Ideen, bitte?

0 Stimmen

Sie sind auf dem richtigen Weg - gibt es weitere spezifische Probleme?

0 Stimmen

Ich dachte, es gäbe einen professionelleren, effektiveren, schnelleren und kürzeren Ansatz.

0 Stimmen

@Diarmaid Sind Sie sicher, dass er es ist? Er wählt zwei Felder mit einer Unterabfrage aus, die im "="-Vergleich verwendet wird. Das ist definitiv nicht der richtige Weg ;)

4voto

Joe Stefanelli Punkte 128819
SELECT u2.id, u2.country_id, u2.city_id, u2.surname 
    FROM users u1
        INNER JOIN users u2
            ON u1.country_id = u2.country_id
                AND u1.city_id = u2.city_id
                AND u1.id <> u2.id
    WHERE u1.id = 'current_id'

0 Stimmen

+1 - mit JOIN s sollte eine bessere Leistung als Unterabfragen bieten.

0 Stimmen

Eigentlich, @Piskvor, ist das ein Mythos. In Fällen, in denen die Unterabfragen Folgendes zurückgeben verschiedene Rowsets für jede Zeile der primären Abfrage, ist das oft der Fall (z. B. where childcolumn = parentquery.something ). Aber in dem Fall, in dem sich die Unterabfragen nicht ändern (wie in diesem Fall, in dem die current_id konstant ist), sollte jedes anständige DBMS im Grunde nur zwei blitzschnelle Abfragen ausführen (vorausgesetzt id ist natürlich indiziert), gefolgt von der Hauptdatei. Ich weiß, dass DB2 dies tut. Bei anderen DBMS bin ich mir nicht sicher.

0 Stimmen

@Piskvor, @paxdiablo: Aus Neugierde habe ich beide Versionen auf Microsoft SQL Server mit einer Adresstabelle mit etwas mehr als 0,5 Mio. Zeilen ausprobiert und, si city_id und country_id indiziert sind, ist diese Join-Version besser als die Subquery-Version.

1voto

paxdiablo Punkte 809679

Zunächst einmal sollten Sie nicht die id Felder innerhalb der Unterabfragen.

Versuchen Sie stattdessen, etwas zu verwenden wie:

SELECT id, country_id, city_id, surname
FROM users
WHERE country_id = (SELECT country_id FROM users WHERE id = 'current_id')
  AND city_id    = (SELECT city_id    FROM users WHERE id = 'current_id')

0voto

magma Punkte 8242

Frank,

.. WHERE country_id = (SELECT id,country_id FROM users ..

vergleichen Sie einen einzelnen Wert ( land_id ) zu einer zweispaltigen Ergebnismenge ( id , land_id ). Dies ist falsch.

Ihre Anfrage, umgeschrieben, würde lauten:

SELECT id,country_id,city_id,surname FROM users WHERE country_id = (SELECT country_id FROM users WHERE id = 'current_user') AND city_id = (SELECT city_id FROM users WHERE id = 'current_id')

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X