sortiert aus zwei tabellen lesen

Miraculixx

Erfahrenes Mitglied
Hi, ich habe ein denke ich mal etwas ungewöhnliches Problem.
Ich habe zwei Tabellen, die miteinander verknüpft sind.
Das lässt sich ungefähr so darstellen (ich hoffe das ist verständlich genug.. ;)):
tabelle table_1(ID, table_1_ID_A, table_1_ID_B)
tabelle table_2(ID, wert1, wert2,...)

Also die table_1 ist zwei Mal mit der table_2 verknüpft.
Mein Problem: Ich möchte (mit PHP) aus diesen beiden Tabellen lesen, und zwar so, dass mein Ergebnis nach table_2.wert1 sortiert ist.
Hat dafür jemand eine Idee? oder soll ich da lieber im PHP-Bereich nachfragen?

Ahja, verwendet wird PHP5 und MySQL 4
 
Zuletzt bearbeitet:
Da musst du dann erstmal eine Verbindung mit MySQL herstellern.

Das machst du so
Code:
mysql_connect("host", "name", "passwort");
mysql_select_db("datenbank") or die(mysql_error());
So das ist aschon deine Verbindug. Nun musst du nur noch das SQL-Statment formulieren
Code:
$sql="SELECT * FROM table_1, table_2 WHRERE table_1.ID = table_2.ID ORDER BY table1.wert1";
Das könnte man zwar auch über einen JOIN machen aber bei zwei Tabellen ist das so die einfachste möglickeit.
Jetzt das SQL Statement nur noch ausfüren
Code:
$ergebnis = mysql_query($sql);
while($row = mysql_fetch_object($ergebnis))
{
echo "$row->SPALTENNAME <br>";
}
Um dann mehrer Spalten anzeigen zu lassen wiederholst du dann einfach nur $row->bla;
 
Ok Danke für die Antwort, aber ich habe mich anscheinend doch etwas unverständlich ausgedrückt.
Es wird nämlich noch etwas komplizierter:
angenommen ich habe in der table_1 folgende werte:
Code:
ID     BEZEICHNUNG     NR_A     NR_B
 1     eins              1        2 
 2     zwei              3        4
und in table_2 folgende werte:
Code:
ID     BEZEICHNUNG     SONSTIGES
 1     ddd
 2     bbb
 3     aaa
 4     ccc

und das ergebnis soll - sortiert nach Bezeichnung_A - so aussehen:
Code:
ID     BEZEICHNUNG_A     BEZEICHNUNG_B
 2     aaa               ccc
 1     ddd               bbb

bzw. man soll es dann auch noch nach Bezeichnung_B sortieren können.
Ich hoffe, ich hab da jetzt keinen Fehler drin und es ist jetzt etwas verständlicher...
 
Mach zwei LEFT Joins und dann ein ORDER BY BEZEICHNUNG_A ASC, BEZEICHNUNG_B ASC....

Außer ich versteh da jetzt irgendwas ganz falsch...
 
Hmmm... kannst du mir auch erklären, wie man ein LEFT-JOIN schreibt bzw. für was das gut ist?

Und noch ein kleiner Beitrag zur Verständlichkeit:
momentan sieht die ganze Sache so aus:
PHP:
$stmt = "select ID, NR_A, NR_B from table_1;
$ergebnis = mysql_query($stmt);
while($row = mysql_fetch_object($ergebnis))
{
  $bez_a = getBezeichnung($row->NR_A);
  $bez_b = getBezeichnung($row->NR_B);
  $datensatz = array($row->ID, $bez_a, $bez_b);
  $daten[] = $datensatz;
}

Was getBezeichnung macht, ist glaube ich verständlich (also die Bezeichnung aus table_2 lesen, die zur NR_A bzw. zur NR_B gehört).
Mein Wunsch ist es eben, dass nun alle Elemente sortiert nach bez_a in dem daten-array drin stehen. Durch einen Aufruf mit einem anderen Parameter sollte man das ganze alternativ auch nach bez_b sortieren können (aber das ist ja dann kein Problem mehr sobald das ganze mit bez_a funktioniert).
 
Ein Join verbindet die Datensätze zweier Tabellen miteinander und bildet daraus ein Gesamtkonstrukt (kannst Du Dir in etwa wie einen großen Table der alle Daten aus Tabelle A und Tabelle B enthält vorstellen).

Details zu Join: http://dev.mysql.com/doc/mysql/en/join.html

Und dann machst Du folgenden Query:

Code:
SELECT
t1.datenfeld,
t2.bezeichnung as t2bezeichnung,
t3.bezeichnung as t3bezeichnung
FROM
table_a as t1,
LEFT JOIN table_b as t2 on t1.fk1=t2.pk
LEFT JOIN table_b as t3 on t1.fk2=t3.pk
ORDER BY t2.bezeichnung ASC, t3.bezeichnung ASC

Damit wird der zweite Table zwei mal auf den ersten gejoint, einmal gebunden an den ersten fremdschlüssel, einmal gebunden an den zweiten (der Tabelle a).

LG
Mike
 
Vielen vielen Dank, ich werd es gleich ausprobieren!
Da spreche ich ja grad mit einem Profi ;)
Aber ist ein LEFT-Join nicht das gleiche wie einfach ein Join? Oder gibt es da einen unterschied?

OK, ähm, wo genau gehört denn das JOIN hin? Normalerweise schreibe ich ein Join ja immer einfach mit einer ganz normalen WHERE-Bedingung.
Mein Select sieht jetzt folgendermaßen aus und funktioniert NICHT:
Code:
select 
  an.AnfrageID as id, 
  k.Firma as firma, 
  an.LeitungA as leitunga, 
  an.LeitungB as leitungb, 
  date_format(an.Datum, '%e.%c.%Y') as datum, 
  an.Abgeschlossen as abgeschlossen
from kunde k, 
  ansprechpartner ap, 
  anfrage an 
where k.KundenID = ap.KundenID 
  and an.AnsprechpartnerID = ap.ID 
  and an.Abgeschlossen like 'N' 
LEFT JOIN leitung as l1 on an.LeitungA=l1.ID 
LEFT JOIN leitung as l2 on an.LeitungB=l2.ID 
order by 3 ASC
Was muss ich hier ändern damit das ganze Ding auch klappt?

OK, ich habs jetzt so halbwegs hinbekommen... aber ich bekomme jetzt jede zeile 10 mal, da fehlt noch irgend wo ein JOIN
momentan sieht das select so aus:
Code:
select an.AnfrageID as id, 
  k.Firma as firma, 
  l1.Ort as orta, 
  l2.Ort as ortb, 
  date_format(an.Datum, '%e.%c.%Y') as datum, 
  an.Abgeschlossen as abgeschlossen 
from kunde k, 
  ansprechpartner ap, 
  anfrage an, 
  leitung l 
LEFT JOIN leitung as l1 on an.LeitungA=l1.ID 
LEFT JOIN leitung as l2 on an.LeitungB=l2.ID 
where k.KundenID = ap.KundenID 
  and an.AnsprechpartnerID = ap.ID 
  and an.Abgeschlossen like 'N' 
order by 1 ASC

JUHUUU - ich hab's geschafft! :)
Select sieht jetzt so aus:
Code:
select an.AnfrageID as id, 
  k.Firma as firma, 
  l1.Ort as orta, 
  l2.Ort as ortb, 
  date_format(an.Datum, '%e.%c.%Y') as datum, 
  an.Abgeschlossen as abgeschlossen 
from kunde k, 
  ansprechpartner ap, 
  anfrage an 
  LEFT JOIN leitung as l1 on an.LeitungA=l1.ID 
  LEFT JOIN leitung as l2 on an.LeitungB=l2.ID 
where k.KundenID = ap.KundenID 
  and an.AnsprechpartnerID = ap.ID 
  and an.Abgeschlossen like 'N' 
order by 4 ASC

Aber könntest du mir noch erklären, was das LEFT JOIN macht? Ich habe auf der MySQL-Homepage zwar nachgelesen, den englischen text aber nicht verstanden... Das Select sieht zwar ganz so aus, als ob es richtig wäre, aber ich habe keine Ahnung warum...
 
Zuletzt bearbeitet:
Zurück