Geht es kürzer?

Supeede

Neuer Benutzer
Beiträge
4
Ich habe eine Abfrage, die so funktioniert. Nun würde ich aber gerne wissen, ob es kürzer und ordentlicher geht.

Original:

SELECT t2.ort FROM t2 WHERE t2.id=ANY(
SELECT t3.ort_id FROM t3 WHERE t3.user=
(SELECT t1.user_id FROM t1 WHERE t1.user_name ='username') AND t3.besucht>='1')

zeige alle orte, die user mehr als einmal besucht hat.

3 tabellen,
Liste user
Liste orte
liste mit usern und orten

Vielen dank schon mal :)
 
Werbung:
So sollte es gehen.

Code:
SELECT t2.ort FROM t1
LEFT JOIN t3 ON t3.user = t1.user
LEFT JOIN t2 ON t2.id = t3.ort_id
WHERE t1.user_name ='username' AND t3.besucht > 1;


Habs nicht getestet. In deinem Beispiel solle es aber ach > 1 und nicht >= 1 heissen.


Gruss

Bernd
 
größer gleich 1 liegt daran, das es auch mehr als einmal besucht werden kann :)

und, bei deiner anweisung kommt ein leeres ergebnis.

Danke für deine mühe, aber es sieht nicht kürzer aus, und bei einer db von ungefähr 200 usern macht es das, wenn sie gehen würde, nicht viel schneller, oder?
 
P.S. ich verstehe deine abfrage auch nicht :)

wie kann denn select t2.ort from t1 funktionieren?

Sorry aber, das prinzip joins habe ich, trotz vieler tutorial webseiten einfach noch nie verstanden.

meine obige abfrage fragt ja alle ortnamen aus t2, bei denen die user_id (die aus t1 geholt wird) und die anzahl der besuche beides in t3 drin vorkommt.

deine abfrage möchte alle ortsnamen aus t1 join (bei denen) t3.user = t1.user (verständlich) und t2.id = t3.orts_id (auch verständlich)
WHERE (also auch bei denen) t1.user_name=user und t3.besucht>1


ich blick da einfach nicht durch :)
 
zeige alle orte, die user mehr als einmal besucht hat.
In deinem Beispiel solle es aber ach > 1 und nicht >= 1 heissen.
größer gleich 1 liegt daran, das es auch mehr als einmal besucht werden kann :)
Vielleicht kommst du ja von selbst drauf :)

Danke für deine mühe, aber es sieht nicht kürzer aus, und bei einer db von ungefähr 200 usern macht es das, wenn sie gehen würde, nicht viel schneller, oder?
Ob eine Abfrage schnell oder langsam ist hängt nicht davon ab ob sie viele Anweisungen enthält sondern ob die Lesekosten möglichst gering sind.

Meiner Erfahrung nach sind zwei JOINS günstiger als zwei Subselects. Genaueres kann dir aber nur MySQL selbst sagen. Das liegt einfach daran, dass relationale Datenbanken mit JOINS besonders gut umgehen können.

und, bei deiner anweisung kommt ein leeres ergebnis.

Die Spaltennamen stimmen anscheinend nicht ganz. Versuchs mal damit:
Code:
SELECT t2.ort FROM t2
INNER JOIN t3
    ON t2.id = t3.ort_id
INNER JOIN t1
    ON = t3.user = t1.user_id
WHERE t1.user_name ='username'
AND t3.besucht > 1;

Warum @BerndB LEFT JOINS verwendet weiß ich nicht. Könnte aber sein, dass die Abfrage dadurch nochmal geringfügig schneller wird. Allerdings sind die Dinger auch ein wenig tricky. Denn nach den Rechenregeln können hier durchaus leere Mengen entstehen.

wie kann denn select t2.ort from t1 funktionieren?
Das hängt mit dem JOIN zusammen, da die Felder aus t2 später bei der Projektion durch SELECT in der Ergebnismenge vorhanden sind.

Sorry aber, das prinzip joins habe ich, trotz vieler tutorial webseiten einfach noch nie verstanden.
Vielleicht kannst du ja was mit dem kartesischen Produkt anfangen? Ein JOIN ist grundsätzlich nichts anderes. Alle Zusätze sind dann Einschränkungen um die Ergebnismenge zu reduzieren.
 
Werbung:
Danke für deine umfangreiche Antwort.
Im Beispiel von Bernd war wirklich nur ein Spaltenname falsch, und dann ging es.

In deinem Beispiel, was ich jetzt nicht getestet habe, verstehe ich zwar die Abfrage, aber ich sehe nicht, woher er nun die t3.ort_id bekommt. Aber ich denke mir, da er da er bei joins wohl alle zeilen sucht, in der t3.besucht >1 ist, er dann automatisch die spalte t3.ort_id ausliest.

aber wegen dem >1 und >=1, wenn ich ihm nur >1 gebe, dann klappt die abfrage nicht. also lass ich einfach >=1 :)

Danke fürs helfen.
 
Zurück
Oben