JOIN: 2 versch. datensätze aus 1 tabelle

  • Themenstarter Themenstarter HabneFrage1386
  • Beginndatum Beginndatum
H

HabneFrage1386

Habe ein PN-System und möchte mir gerne 2 querys sparen.

Habe es etwa so aufgebaut: id | titel | content | to | from

in to und from steht die userid, die tabelle ist so aufgebaut: id | name | group | ....

ich möchte jetzt anhand von einem datensatz aus der pn-tabelle die 2 datensätze aus der user-tabelle holen

1 datensatz kann ich ja mit nem join holen, aber wie mache ich es mit dem 2.

sollte dann so aussehen "SELECT ..., user.name AS to_name, user.name AS from_name, ..."

aber ich weis nicht wie ich das mit 2 namen anstellen kann

Danke schonmal für paar lösungsansätze ;)
 
Du kannst die Tabelle zweimal joinen, jeweils mit nem anderen Alias.
Mal nen kleines Beispiel:

SELECT from.name AS from_name, to.name AS to_name
FROM (pn join user as from on pn.from = from.id)
join user as to on pn.to = to.id;

Ist jetzt nur so aus dem stehgreif geschrieben, kann dir auch nicht garantieren, dass die Syntax so stimmt, bin eher PostgreSQL gewohnt, ist ja aber recht ähnlich.
Wie schon erwähnt, der wichtigste Punkt ist der doppelte Join auf die gleiche tabelle nur mit nem anderen alias("as").

Gruß

Matt
 
Man könnte hierfür Alias Tables aufbauen (HEAP/MemoryTable je nach DB unterschiedliche Namen) . Diese wird über eine Stored Procedure abgefragt. Da die Tabelle komplett im RAM liegt sollte der DB Server über genügend RAM verfügen. Diese Art der Abfrage ist aber nur sinnvoll wenn die Daten auch entsprechend oft nachgefragt werden.

Zum Beispiel Userrechte, Namen etc.

Dabei kannst du unter MySQL, vermute ich jetzt mal anhand der JOIN Synthax, wie folgt vorgehen:

zuerst eine HEAP Table erzeugen:
http://dev.mysql.com/doc/refman/5.0/en/memory-storage-engine.html
CREATE TABLE [tablename]
....[normale Create Synthax]
ENGINE = MEMORY;

ACHTUNG! tmp_table_size + Abhängigkeiten limiert die maximale TableSize bei HEAP´s.

Danach kann man wunderbar die Daten syncen mit z.B. REPLACE, für den erstimport oder neuanlage und einer Reihe von Update, Insert bzw. Delete Triggern.

Danach legst du dir noch ne Stored Procedure an:
http://dev.mysql.com/doc/refman/5.0/en/stored-routines.html

Innerhalb dieser Funktion liest du alle Daten und baust dir das Rückgabefeld auf. Man kann sogar mehrere Datenzurückgeben.
INFO: Da die Daten komplett im RAM liegen bringen Indexe kaum was, also selber auf die Kardinalität achten.
ACHTUNG: NIEMALS HEAP´s MIT NORMALEN TABELLEN VERKNÜPFEN, wenns nicht umbedingt sein muss. Da die HEAP´s dann auf die Geschwindigkeit der langsamsten Tabelle gebremst wird. Dann lieber 2 SQL schicken.

In deinem Fall würdest du einen VARCHAR zurückgeben, als Eingangswert dient die UserID.

In deiner Abfrage outet sich das dann in etwa so:
Name der Stored Procedure (SP): getUserName([UserID])

SELECT getUserName(user.to) AS To_User, getUserName(user.from) AS From_User...

Das sind zwar 3 SQL´s jedoch immernoch um Welten schneller als 2 bzw. 3 Joins. Vorallem kann man hier die Stärke der HEAP´s ausspielen. Würde ich den HEAP verknüpfen wäre es nicht besser als die Lösung meines Vorposters.

Kommt halt auf die Anwendung an. Wenn du ein genaues Beispiel hast bau ich dir gerne MusterSQL´s bzw. Scripte auf.

Ich hoffe ich konnte dir helfen

Gruss
SK
 
Zuletzt bearbeitet:
Zurück