Ich habe drei Basistabellen:MySQL Select JOIN 3 Tabellen
tblUsers:
usrID usrFirst usrLast
1 John Smith
2 Bill Jones
3 Jane Johnson
pm_data:
id date_sent title sender_id thread_id content
2 2009-07-29 18:46:13 Subject 1 1 111 Message 2!
3 2009-07-29 18:47:21 Another Subject 1 222 Message 3!
pm_info:
id thread_id receiver_id is_read
1 111 2 0
2 111 3 0
3 222 2 0
4 222 3 0
Im Grunde, was ich versuche zu tun, einen Posteingang erstellen.
Also, wenn usrID 2 (Bill Jones) seinen Posteingang öffnet, wird er sehen, dass er 2 ungelesene (daher die 'is_read' Spalte) Nachrichten (Threads # 111 und # 222).
Im Grunde muss ich wissen, wie ich meine SELECT-Anweisung zu JOIN allen drei Tabellen einrichten (die Beziehung zwischen pm_data und pm_info bringt die Nachricht Info, während die Beziehung zwischen tblUsers und pm_data bringt den 'Anzeigenamen' von der Absender), um den neuesten (nach Zeitstempel?) Thread oben anzuzeigen.
So würden wir so etwas wie dies sehen:
<?php $usrID = 2; ?>
<table id="messages">
<tr id="id-2">
<td>
<span>
From: John Smith
</span>
<span>2009-07-29 18:47:21</span>
</td>
<td>
<div>Another subject</div>
</td></tr>
<tr id="id-1">
<td>
<span>
From: John Smith
</span>
<span>2009-07-29 18:46:13</span>
</td>
<td>
<div>Subject 1</div>
</td></tr>
</table>
Hoffentlich macht Sinn! Danke für jede Hilfe!
EDIT: Hier ist meine letzte Antwort:
I lc Rat nahm, und machte die Beziehung zwischen den beiden Tabellen basierend auf ID (hinzugefügt, um eine Spalte ‚message_id‘ genannt pm_info).
Dann zwickte die MySQL-Anweisung um ein wenig mit diesem zu kommen:
SELECT pm_info.is_read, sender.usrFirst as sender_name,
pm_data.date_sent, pm_data.title, pm_data.thread_id
FROM pm_info
INNER JOIN pm_data ON pm_info.message_id = pm_data.id
INNER JOIN tblUsers AS sender ON pm_data.sender_id = sender.usrID
WHERE pm_data.date_sent IN(SELECT MAX(date_sent) FROM pm_data WHERE pm_info.message_id = pm_data.id GROUP BY thread_id) AND pm_info.receiver_id = '$usrID' ORDER BY date_sent DESC
Das ist für mich zu funktionieren scheint (bisher).
Danke lc, für Ihre Antwort. Ihre komplizierte Abfrage ist definitiv die Richtung, in die ich gehe. Es wirft keine Fehler auf, aber es macht ein paar Dinge: 1) Es zeigt immer noch alle Teile des Threads (sogar die gesendeten Elemente des Benutzers, die sich auf den Thread beziehen) und 2) Es zeigt es in Duplikaten. Lassen Sie es mich wissen, wenn Sie mich expliziter brauchen. Vielen Dank. – Dodinas
@Dodinas 1) Es werden alle Teile des Threads angezeigt. Wenn Sie nicht alles anzeigen möchten, müssen Sie sich überlegen, was genau Sie ausfiltern und der WHERE-Klausel hinzufügen möchten. Es könnte auch mehr in der Beziehung zwischen "pm_data" und "pm_info" geben, die ich vermisse, denn alles, was ich jetzt tun muss, ist die Thread-ID ... 2) Kannst du etwas mehr von den Tabellen posten? Inhalt, damit ich sehen kann, wo das schief gehen könnte? INNER JOINs sollten keine doppelten Zeilen erzeugen. Es ist auch möglich, dass Ihr Fehler in PHP nach der Ausführung der Abfrage liegt ... –
@lc: Danke für die Antwort. Im Grunde glaube ich nicht, dass das Problem bei PHP liegt. Es könnte jedoch ein Problem mit der Struktur meiner Datenbank sein. Was ich gepostet habe, sind die Tabellen, mit denen ich arbeite. Die 'thread_id' ist das einzige, was die beiden Tabellen betrifft. Vielleicht muss ich meine db-Struktur ändern? – Dodinas