Seite 1 von 1

MySQL Abfrage vereinfachen (verschachtelung), wer kann helfe

Verfasst: 22.10.2007 12:24
von Mafia GmbH
Hallo, ich habe eine MySQL abfrage das über 2 Tabelen läuft. Das Problem will ich nach dem Beispiel erstmal erleutern. Bzw. ob man irgend wie besser machen kann.

Tabelle: Tab_User
Felder: user_id, user_name, user_email, user_icq

Tabelle2: Tab_koppeln
Felder: user_id1, user_id2

SQL Abfrage:
SELECT user_id1, user_id2,
(SELECT user_icq FROM Tab_User WHERE user_id = user_id1) AS icq1,
(SELECT user_icq FROM Tab_User WHERE user_id = user_id2) AS icq2,
(SELECT user_name FROM Tab_User WHERE user_id = user_id1) AS name1,
(SELECT user_name FROM Tab_User WHERE user_id = user_id2) AS name1
FROM Tab_koppeln;

PROBLEM:
Die obige abfrage solte so gut wie funktionieren, aber wen ich vom user 1 und vom user 2 noch mehr Felder benötige, muß ich extrem viel diese verschachtelte (SELECT ...) anweisungen reinbringen.
IChbin natürlich nicht schreibfaul und kann dies ja auch machen, aber ich denke für MySQL ist es eher viel mehr arbeit, weil muß bei jeder (SELECT...) immer wieder den user finden um eine zeile auszulesen.

Geht es nicht irgend wie einfacher, das man irgend wie sagt, hol aus user 1 die und die Felder und vom User 2 holl die und die Felder. Also damit mysql nicht ständig den user auffinden muß um wieder ein doofes Feld auszulesen.

Verfasst: 23.10.2007 09:19
von Seimon
Kannst du kurz beschreiben was du damit machen willst? Wofür brauchst du eine derartige Abfrage?

Verfasst: 23.10.2007 18:20
von Mafia GmbH
Ja das war nur ein Beispiel, tatsechlich brauche ich so eine Abfrage für einen Forum Abfrage.
Das heißt in einer Tabelle wird ein Thema aufgemacht und es werden auch Antworten dort mit aufgenohmen.

So jetzt will ich aber so abfragen das ich den Titel der Thema des ersten Post abfrage und gleichzeitig den User des Letzten Post abfragen muß.
Und das sind eben 2 Einträge in der Tabelle.

Also so änlich wie ich das mit dem Beispiel gebracht habe.

Also kann man die Abfrage irgend wie vereinfachen? weil so wie die ist funktioniert zwar, aber kann ich statt immer nur ein Feld durch (SELECT ...) abrufen, sondern gleich mehrere Felder?

Verfasst: 23.10.2007 18:47
von Pyramide
Hier ein Beispiel, wie man Name+ICQ+E-Mail sowohl von Sender und Empfänger einer PN ermittelt:

Code: Alles auswählen

SELECT u1.username AS u1_name, u1.user_icq AS u1_icq, u1.user_email AS u1_email,
       u2.username AS u2_name, u2.user_icq AS u2_icq, u2.user_email AS u2_email
FROM phpbb_privmsgs p
  LEFT JOIN phpbb_users u1 ON (u1.user_id = p.privmsgs_from)
  LEFT JOIN phpbb_users u2 ON (u2.user_id = p.privmsgs_to)
WHERE p.privmsgs_id = ?

Verfasst: 24.10.2007 10:37
von Mafia GmbH
vielen Dank, werde gleich ausprobieren.
Nun ist natürlich die Frage gestelt ist es auch Schneller, oder genau so schnell oder langsamer.

Welche Methode ist jetzt schneller, bzw. solte schneller sein?
Sonst kann ich ja noch zeitstoppen, und dan durch Fakten eindeutig belegen lassen, was nun schneller sein soll.

Weil hatte mal frücher mit INNER JOIN rumexperementiert, und rausgefunden das wen man stat INNER JOIN einfach in der WHERE anweisung einfach die 2 IDs von den zwei mit = setzt. Dass es sogar etwas schneller sein. Naja, aber LEFT und RIGHT JOIN kann man wohl nicht so eligant umgehen.

Aber wer mich was besseren Lehren möchte, würde ich mich freuen:)