Nutzung eines Joins? Einträge auslesen

Kalma

Erfahrenes Mitglied
Hi,

ich stehe grad vor einem kleinen Problem.

Ich habe 4 Datenbanktabellen:
- Benutzer (user)
- Avatar (avatar)
- Gästebucheinträge (wall)
- Benutzereinstellungen (security)

user:
user_id
user_firstname
user_lastname

avatar:
avatar_owner_id
avatar_path

wall:
wall_id
wall_actor_id
wall_text

security:
setting_user_id
show_firstname
show_lastname


Jetzt will ich die Einträge aus der Wall auslesen.
Zusätzlich soll der Name über die wall_actor_id + das passende Avatar + die Sicherheitseinstellungen ausgegeben werden.

Jetzt frage ich mich, ob ich das mit einem Join lösen soll, oder für zum Beispiel das anzeigen des Namens eine Funktion erstellen soll.
Bisher hatte ich für das Auslesen des Namens und des Avatars jeweils eine Funktion.

Also zum Beispiel:
getName($id) -> Überprüft die Sicherheitseinstellungen und gibt dementsprechend den Namen zurück.
getAvatar($id) -> Liest das Avatar aus und prüft ebenfalls, ob die Datei vorhanden ist. Ansonstne wird ein defaultavatar zurückgegeben.

Dann habe ich immer in der Whileschleife, in der ich die Einträge ausgelesen habe, folgendes gemacht:

PHP:
while($select = mysql_fetch_array($result)
{
   echo getAvatar($select['wall_actor_id']);
   echo getName($select['wall_actor_id']);
}

Dabei wurde ich darauf hingewiesen, dass dies natürlich viel Leistung zieht, da bei jedem Durchlauf eine Datenbankabfrage gemacht wird.


Könnt ihr mir helfen? Ist das eine günstige Lösung oder sollte ich tatsächlich für all diese Sachen einen Join machen?


Gruß und Danke im Vorraus!
 
Join ist schneller.
Wenn die Funktion auch noch jedesmal ein SQL absetzt, ist es extrem schlecht für die Performance.
 
Aber eine Abfrage zu machen, welche Daten jetzt anzuzeigen sind und welche nicht, ist doch in einem Join sehr sehr aufwendig oder nicht?

Kann auch sein dass ich das einfach nicht richtig im Blick habe, weil ich mir das selber beigebracht habe, aber ich stelle mir das aufwendiger vor.

Aber um zu prüfen, ob ein AvatarBild existitiert müsste man dann eine Funktion schreiben, richtig?
 
Zuletzt bearbeitet:
Da du mit PHP programmierst, gehe ich mal davon aus, dass es sich um MySQL handelt.

Dein Avatar-Fall ist ein typisches Beispiel für LEFT JOIN und IFNULL().

Hier mal der Ansatz für den Avatar
SQL:
SELECT
	wall.*,
	IFNULL(avatar_path, 'default_path') AS avatar_path
FROM
	wall
	LEFT JOIN avatar
		ON wall.wall_actor_id = avatar.avatar_owner_id
 
Zuletzt bearbeitet von einem Moderator:
Vielen Dank! Das ist ne super Lösung. Und tatsächlich wird die Seite minimal schneller aufgebaut. Habe mir mal die Zeit berechnen lassen.

Ich suche momentan ein gutes Sql-Tutorial für solche Sachen, und bin auf dieses gestoßen:
http://www.sql-tutorial.net/
Ob das die Beste Wahl ist, weiß ich nicht.


Eine (vorerst) letzte Frage habe ich noch, denn diese habe ich durch googlen, probieren und sogar denken nicht herausfinden können.
Ein User kann mehrere Adressen haben, die sich in der Tabelle Adressen befinden.

Jetzt möchte ich allerdings beim Auslesen nicht folgende Darstellung:

Max Mustermann -> Straße Xy, 49102 Musterstadt
Max Mustermann -> Straße 91, 1582 Berlin
Max Mustermann -> straße 15, 6566 köln

sondern
Max Mustermann -> Straße Xy, 49102 Musterstadt
Straße 91, 1582 Berlin
straße 15, 6566 köln

Ist das mit einem Join möglich? Ich bekomme zwar immer alle Adressen heraus, aber halt nicht gruppiert.


Gruß und vielen Dank!
 
hmm wenn ichs richtig verstehe willst du nur eine bestimmte Adresse von dem User anzeigen.
Wie wäres, wenn du in deiner Adress-tabelle noch das Feld Rolle einführst?
Also z.b
Rolle = 1 --> Lieferadresse
Rolle = 2 --> AdressefürWall
Rolle = 3 --> wasweißichfürneadresse
usw...
 
SQL ist immer Zeilenmässig. Du kannst aber die Mustermanns mit einem GROUP BY zusammenfassen und die Adressen im Feld mit einem Zeilenumbruch verbnden
SQL:
SELECT 
    name, 
    GROUP_CONCAT(adress SEPARATOR '\n')  AS adressen
FROM
    mytable
GROUP BY
    name;

Ergibt dann so was
Code:
name | adressen
===============
nam1 | adress11
     | adress12
---------------
nam2 | adress21
     | adress22
 
Zuletzt bearbeitet von einem Moderator:
Zurück