MySQL Abfrage über 2 Tabellen

TTlong

Angesehenes Mitglied
Hallo,

ich habe 2 Tabellen in einer DB:

Tabelle: rat_users
++++++++++++++
+ id + <WERT> +
+ name + <WERT> +
++++++++++++++

Tabelle: rat_article
++++++++++++++++
+ id + <WERT> +
+ author_id + <WERT> +
++++++++++++++++

auhtor_id ist dabei gleich mit id aus rat_users


Ich brauche nun alle Daten aus rat_article UND name as author aus rat_users (WHERE author_id = id??) in einer Abfrage.


Hab mir schon diverse Abfrageschemen durchgelesen aber irgendwie schlau werd ich daraus nicht.

 
Schau Dir mal das Thema "Joins" an:

SELECT a.id, a.author_id FROM rat_article a LEFT JOIN rat_users u ON u.id = a.author_id
 
Wenn ich:

CODE SELECT a.* FROM rat_article a LEFT JOIN rat_users u ON u.id = a.author_id


Schreibe funktioniert die Ausgabe erstmal fast wie gewollt, es liefert zumindest alle releanten Daten aus rat_article.

Ich benötige aber den <WERT> der Spalte name aus der Tabelle rat_users.

Normal wird das mit xxx AS yyy realisiert, nur wo soll ich das in deinem Statement noch unterbringen?


Danke aber schonmal bis hierhin...
 
Ich werde aus JOINS auch nicht richtig schlau, habe die auch irgendwo bei MySQL 4.1 verworfen, da der MySQL Query Optimizer damit teils so viel Mist gebaut hat, dass man auf einmal extrem langsame Querys hatte. Leider ist mir nicht bekannt, ob der nun gefixed wurde, ansonsten lassen sich einfache Joins mittels Where-Klausel auch schreiben:

Wobei aber die author_id, natürlich hier als Beispiel nicht so dolle ist. Für das strukurierte sollte der Fremdschlüssel mit tabellenname_id betitelt werden, hier also rat_users_id.

Statt einen simplen LEFT JOIN kann dies natürlich auch wie folgt die Abfrage gestallten:
SQL SELECT rat_article.*, rat_users.name FROM rat_users, rat_article WHERE rat_users.id = rat_article.author_id;


Was vom beiden schneller ist, müsstest Du dann selbst mal testen, wie gesagt, bei einigen JOIN-Abfragen hat damals der MySQL Query Optimizer ganz ehrheblichen mist gebaut, so dass die Abfragen um ein Vielfaches länger dauerten. Dies kann natürlich schon lange behoben sein. Ich habe nur das damals so gelernt und nach der JOIN-Einweisung so beibehalten, Aufgrund der damaligen Situtation.


Solltest Du bendechos Abfrage benutzen müsstest Du Sie noch wie folgt ändern, sonst liefert die Abfrage nicht alle gewünschten Daten zurück:


SQL SELECT a.*, u.name FROM rat_article a LEFT JOIN rat_users u ON u.id = a.author_id;
 
So klappts:


CODE SELECT a.*, u.name AS author FROM rat_article a LEFT JOIN rat_users u ON u.id = a.author_id



Danke euch beiden.
 
Man kann sehr schnelle Joins bauen, dazu bietet MySQL auch mit Explain eine Ausgabe an um die Abfrage zu optimieren. Ohne hat man entweder sehr viel mehr Datenbankabfragen oder extrem wenig normalisierte Tabellen - beides nicht unbedingt zu empfehlen.

Versuche nicht *-Abfragen zu machen, sondern lieber mit genauer Spaltenangabe.
 
QUOTE (bendecho @ Mi 22.02.2012, 12:27) Versuche nicht *-Abfragen zu machen, sondern lieber mit genauer Spaltenangabe.

Auch wenn ich wirklich ALLE Daten brauche? In dieser Tabelle sind 12 Spalten, ist es performanter wenn ich * weglasse und alle Spalten einzeln angebe?
 
QUOTE (bendecho @ Mi 22.02.2012, 12:27) [...] extrem wenig normalisierte Tabellen - beides nicht unbedingt zu empfehlen. [...]

Wobei ich mich natürlich Frage, was das nun mit dem Verwenden von JOINS oder nicht zu tun hat...
 
Zurück
Oben