BlackBoard (http://www.black-board.net/index.php)
- Design, Programmierung & Entwicklung (http://www.black-board.net/board.php?boardid=55)
-- Webdesign (http://www.black-board.net/board.php?boardid=19)
--- PHP + [MYSQL] Komplexes Tabllen joinen... (http://www.black-board.net/thread.php?threadid=20289)


Geschrieben von inde am 19.04.2005 um 22:12:

  + [MYSQL] Komplexes Tabllen joinen...

Hallo BBler!

Ich versuche gerade drei Tabellen miteinander zu verknüfen, aber es haut irgendwie nicht hin. Am besten ich schildere mal kurz wie ich mir das vorstelle:

Es gibt 3 Tabellen:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
TAB1:
// Enthält Daten aus einem Formular
id
name
email
betr_pre
betr
savetime
msg


code:
1:
2:
3:
4:
5:
TAB2:
// Enthält Präfixe für den Betreff
id
betr


code:
1:
2:
3:
4:
5:
6:
7:
8:
TAB3:
// KANN eine Antwort auf msg in TAB enthalten, muss aber nicht
id
msg_id
acpuser_id
savetime
resp


Nun möchte ich folgendes erreichen:

Anfragen aus TAB1 sollen ausgelesen werden, die die folgende Bedinung erfüllen:

Ihre eigene id (TAB1.id) darf nirgends in der TAB3.msg_id vorkommen

Weiterhin sollen anhand der TAB1.betr_pre aus TAB2 das zugehörige TAB2.betr ausgewählt werden

Wie fragt man so etwas ab?



Geschrieben von LX am 19.04.2005 um 22:32:

Achtung RE: + [MYSQL] Komplexes Tabllen joinen...

Versuch's mal mit:

SELECT tab1.name, tab1.email, tab1.msg, tab2.betr FROM tab1, tab2, tab3 WHERE tab1.id<>tab3.msg_id AND tab1.betr_pre=tab2.id

Die Spalte "betr" in tab1 ist BTW überflüssig.



Geschrieben von inde am 19.04.2005 um 22:43:

 

Hm, funktioniert irgendwie net. Kann es daran liegen, dass TAB3 noch keine Zeilen enthält? Dürft ja aber kaum ne Rolle spielen, oder? Die Spalte betr in TAB1 brauch ich, da hier noch ein vom User selbst bestimmter Betrefftext reimkommt.

edit

irgendwie hats funktioniert, als ich in die TAB3 eine Zeile eingefügt habt... bin zwar net 100% zufrieden aber es haut hin. Danke LX!

edit²

Zja, irgendwie funzt es doch net ganz so... TAB1 Zeilen, deren ID in TAB3.msg_id vorkommt werden immernoch ausgegeben. Irgendwas is da falscht. Abgesehen davon werden Datensätze dreimal ausgegeben, obwohl er nur einmal in der tabelle TAB1 is...

Hier mal die komplette Anfrage:
php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
$sql "SELECT
    tab2.id, tab2.name, tab2.email, tab2.betr_pre,
    tab2.betr, tab2.savetime, tab2.ip, tab2.msg, tab3.betr AS betr_pre
   FROM
    ".$TAB."contact_resp AS tab1,
    ".$TAB."contact_msg AS tab2,
    ".$TAB."contact_betr AS tab3
   WHERE
    tab2.id <> tab1.msg_id
    AND tab2.betr_pre = tab3.id
   ORDER BY
    $ordercol $orderdir
    ";


Gerade habe ich noch was rausgefunden:

Die anzahl, wieoft EIN UND DIESELBE Zeile aus TAB1 (im Source tab2) ausgegeben wird richtet sich danach wie viele Zeilen die TAB3 (im Source tab1) hat. Für "k" Zeilen in TAB3 wird der Datensatz mit ID X also "k"-mal ausgegeben. Wenn in TAB3.msg_id die ID von TAB1.id "n"-mal existiert ist diese Zahl "k"-"n". Ich hoffe jemand findet den Fehler...



Geschrieben von inde am 23.04.2005 um 13:04:

 

Sorry dass ich den Thread pushe aber hat echt keine ne Idee, das kann doch net unmöglich sein??? Hier gibts doch Leute die das können, oder? Heeeeelp!



Geschrieben von Deef am 18.06.2005 um 02:27:

 

Zitat:
Original von inde
irgendwie hats funktioniert, als ich in die TAB3 eine Zeile eingefügt habt... bin zwar net 100% zufrieden aber es haut hin. Danke LX!


Liegt daran, dass Du normale JOINS verwendet, deren Bedingung es ist, dass in allen "gejointen" Tabellen Datensaetze vorhanden sind, die die Bedingung erfuellen. Loesung: LEFT JOIN und entsprechende ON-Bedingung.

So in etwa:

code:
1:
2:
3:
4:
5:
SELECT t1.name, t1.email, t1.was_auch_immer from table_1 t1, table_2 t2
  LEFT JOIN table_3 t3 ON t1.id<>t3.msg_id
  WHERE t1.id = t2.id 


Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH