Hallo Andrea,
Hallo zusammen
Ich mühe mich gerade mit einer MySQL-Abfrage ab und komme einfach nicht weiter.
Ich habe eine Tabelle t_0000user mit den Feldern pk_0001user, r_0002email, r0004usertyp. Im Feld r0004usertyp kann entweder ein 'p' (=Person) oder ein 'u' (=Unternehmen) stehen.
Ich vermute, dass das Feld pk_0001user vom Typ INT ist und auf AUTO_INCREMENT eingestellt ist.
In zwei weiteren Tabellen sind dann je nach Usertyp weitere Infos zu diesem User gespeichert:
t_1000personen mit den Feldern pk_fk_1001person_0001 (Fremdschlüssel zu pk_0001user), r_1002name, r_1003vorname, etc.
t_2000unternehmen mit den Feldern pk_fk_2001unternehmen_0001 (Fremdschlüssel zu pk_0001user), r_2002firmenname, r_2003apname, r_2004apvorname, etc.Für eine Übersichtstabelle, in welcher u.a. die ID, E-Mail, Usertyp, Name, Vorname und einige weitere Typen-spezifische Felder angezeigt werden sollen, habe ich bisher 1 + n Abfragen gemacht.
Also jetzt mal vereinfacht:
$query_user = "SELECT pk_0001user, r_0002email, r_0004usertyp FROM t_0000user";
Und dann in einer while-Schleife:
if ($res['r_0004usertyp'] == 'p')
{
// Privatperson
$query_userdet = "SELECT r_1002name AS username, r_1003vorname AS uservorname FROM t_1000personen WHERE pk_fk_1001person_0001 = '". $pk_0001user ."' LIMIT 1";
}
else if ($res['r_0004usertyp'] == 'u')
{
// Unternehmen
$query_userdet = "SELECT r_2002firmenname AS firmenname, r_2003apname AS username, r_2004apvorname AS uservorname FROM t_2000unternehmen WHERE pk_fk_2001unternehmen_0001 = '". $pk_0001user ."' LIMIT 1";
}
>
> Nun möchte ich aber erreichen, dass die HTML-Tabelle, die ich aus dem Resultat der Abfrage erstelle, beliebig sortiert werden kann - also z.B. auch nach dem Namen oder dem Vornamen. Und das klappt ja so nicht, weil diese Abfrage erst in der while-Schleife gemacht wird.
>
> Ich könnte nun natürlich alles zuerst in ein mehrdimensionales Array schreiben und dieses dann vor der Ausgabe nach der gewünschten "Spalte" sortieren. Aber da ich auch noch eine Blättern-Funktion einbauen möchte, macht das ja keinen Sinn, da ich mit dieser Technik zuerst immer alle Datensätze auslesen müsste, obschon ich nur 20 Datensätze brauche...
>
> Also habe ich nun versucht, das alles in eine einzige Abfrage zu packen und diese dann gleich in der Abfrage zu sortieren. Leider aber bisher ohne Erfolg...
>
> Wenn ich das hier probiere:
> SELECT pk\_0001user, r\_0002email, r\_0004usertyp, r\_1002name, r\_1003vorname, r\_2002firmenname, r\_2003apname, r\_2004apvorname FROM t\_0000user LEFT JOIN t\_1000personen ON t\_1000personen.pk\_fk\_1001person\_0001 = t\_0000user.pk\_0001user LEFT JOIN t\_2000unternehmen ON t\_2000unternehmen.pk\_fk\_2001unternehmen\_0001 = t\_0000user.pk\_0001user
>
> bekomme ich eine Tabelle mit den Spalten pk\_0001user, r\_0002email, r\_1002name, r\_1003vorname, r\_2002firmenname, r\_2003apname, r\_2004apvorname
>
> das ist ja eigentlich auch korrekt, aber ich möchte ja eine einzige Spalte "name" oder so erhalten, in welcher dann entweder der Wert aus dem Feld r\_1002name oder der Wert aus dem Feld r\_2003apname drin steht. Nur so kann ich dann ja in einem Wisch richtig sortieren.
>
> Wenn ich's mit einem Alias versuche:
> SELECT pk\_0001user, r\_0002email, r\_0004usertyp, r\_1002name AS testname, r\_1003vorname, r\_2002firmenname, r\_2003apname AS testname, r\_2004apvorname FROM t\_0000user LEFT JOIN t\_1000personen ON t\_1000personen.pk\_fk\_1001person\_0001 = t\_0000user.pk\_0001user LEFT JOIN t\_2000unternehmen ON t\_2000unternehmen.pk\_fk\_2001unternehmen\_0001 = t\_0000user.pk\_0001user
>
> dann bekomme ich eine Spalte "testname" und eine Spalte "testname\_1". Also auch nicht das, was ich möchte...
>
> Wahrscheinlich gehe ich das Ganze völlig falsch an...? Bin für jeden Tipp sehr dankbar.
Hängt von der weiteren Verarbeitung ab...
>
> Vielen Dank und liebe Grüsse
> Andrea
Ich habe mir folgende Test-Tabellen gebaut:
mysql> select \* from t\_0000user;
+-------------+-------------+--------------+
| pk\_0001user | r\_0002email | r0004usertyp |
+-------------+-------------+--------------+
| 1 | 1@test.de | p |
| 2 | 2@test.de | u |
+-------------+-------------+--------------+
mysql> select \* from t\_1000personen;
+-----------------------+------------+---------------+
| pk\_fk\_1001person\_0001 | r\_1002name | r\_1003vorname |
+-----------------------+------------+---------------+
| 1 | mustermann | max |
+-----------------------+------------+---------------+
mysql> select \* from t\_2000unternehmen;
+----------------------------+------------------+--------------+-----------------+
| pk\_fk\_2001unternehmen\_0001 | r\_2002firmenname | r\_2003apname | r\_2004apvorname |
+----------------------------+------------------+--------------+-----------------+
| 2 | firma | mustermann | erika |
+----------------------------+------------------+--------------+-----------------+
Mit der folgenden Abfrage erhalte ich die Datensätze nach Namen und Vornamen sortiert:
\-------------------
SELECT
pk\_0001user,
r\_0002email,
r0004usertyp,
IF(r0004usertyp="p", r\_1002name, r\_2003apname) AS name,
IF(r0004usertyp="p", r\_1003vorname, r\_2004apvorname) AS vorname
FROM
t\_0000user
LEFT JOIN t\_1000personen ON (pk\_0001user=pk\_fk\_1001person\_0001)
LEFT JOIN t\_2000unternehmen ON (pk\_0001user=pk\_fk\_2001unternehmen\_0001)
ORDER BY name, vorname;
\-------------------
Bitte beachte:
1\. Diese Abfrage lässt sich nicht mit jeder x-beliebigen SQL-Datenbank ausführen. Sie funktioniert jedoch mit MySQL. Die IF-Anweisung im SELECT-Part wertet über das Feld r0004usertyp den Typ des Datensatzes aus. Handelt es sich um eine Person, so wird für Name das Feld r\_1002name benutzt. Anderenfalls das Feld 2003apname. Analog verhält es sich mit dem Vornamen.
2\. Die Abfrage ist nicht effizient, d. h. MySQL kann keine Indizes zur Optimierung verwenden. Für die Sortierung muss ein File-Sort angewendet werden. Dies ist jedoch für kleinere Datenmengen unproblematisch. Bei größeren Datenmengen solltest du überlegen, ob du Personen und Unternehmen in einer einzigen Tabelle speicherst. Dies führt zwar dazu, dass bei Personendatensätzen das Firmen-Feld ungenutzt bleibt, allerdings lassen sich auf diese Weise Abfragen wesentlich angenehmer schreiben und effizienter ausführen. Falls dies nicht in Frage kommt, gäbe es noch folgende Möglichkeit:
Erweitere die Tabelle t\_0000user um alle Felder, die sowohl in der Personen- als auch in Unternehmenstabelle stehen (also Name und Vorname, nicht jedoch Firma). Entferne anschließend die Felder Name und Vorname aus der Personen- bzw. Unternehmenstabelle.
Ich hoffe, dass ich