MySQL Select JOIN 3 Tables
Mam trzy podstawowe tabele:
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
Zasadniczo staram się utworzyć skrzynkę odbiorczą.
Tak więc, jeśli usrID 2 (Bill Jones) otworzy swoją skrzynkę odbiorczą, zobaczy, że 2 nieprzeczytane (stąd kolumna „is_read”) (wątki # 111 i # 222).
Zasadniczo muszę wiedzieć, jak skonfigurować moją instrukcję SELECT, aby DOŁĄCZYĆ do wszystkich trzech tabel (relacja między pm_data i pm_info powoduje wyświetlenie informacji, podczas gdy relacja między tblUsers a pm_data powoduje wyświetlenie „nazwy wyświetlanej” nadawcy), aby wyświetlić najnowszy (według datownika?) wątek na górze.
Widzimy więc coś takiego:
<?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>
Mam nadzieję, że to ma sens! Dzięki za pomoc!
EDIT: Oto moja ostateczna odpowiedź:
Wziąłem radę lc i nawiązałem relację między dwiema tabelami w oparciu o id (dodałem kolumnę o nazwie „message_id” do pm_info).
Następnie dostosowałem nieco oświadczenie MySQL, aby to zrobić:
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
Wydaje się, że to działa dla mnie (do tej pory).