[英]MySQL Select JOIN 3 Tables
I have three basic tables: 我有三个基本表:
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
Essentially, what I am trying to do is create an inbox. 基本上,我想要做的是创建一个收件箱。
So, if usrID 2 (Bill Jones) opens his inbox, he will see that he 2 unread (hence the 'is_read' column) messages (threads #111 and #222). 因此,如果usrID 2(Bill Jones)打开他的收件箱,他将看到他2个未读(因此是'is_read'列)消息(线程#111和#222)。
Basically, I need to know how to set up my SELECT statement to JOIN all three tables (the relationship between pm_data and pm_info brings about the message info, while the relationship between tblUsers and pm_data brings about the 'display name' of the sender), to show the most recent (by timestamp?) thread on top. 基本上,我需要知道如何将我的SELECT语句设置为JOIN所有三个表(pm_data和pm_info之间的关系带来了消息信息,而tblUsers和pm_data之间的关系带来了发送者的'显示名称'),在顶部显示最新的(按时间戳?)线程。
Thus, we would see something like this: 因此,我们会看到这样的事情:
<?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>
Hopefully this makes sense! 希望这是有道理的! Thanks for any help!
谢谢你的帮助!
EDIT: Here's my final answer: 编辑:这是我的最终答案:
I took lc's advice, and made the relationship between the two tables based on id (added a column called 'message_id' to pm_info). 我接受了lc的建议,并根据id建立了两个表之间的关系(在pm_info中添加了一个名为'message_id'的列)。
Then, tweaked the MySQL statement around a little bit to come up with this: 然后,稍微调整一下MySQL语句来得出这个:
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
This seems to work for me (so far). 这似乎对我有用(到目前为止)。
You'll need two joins. 你需要两个连接。 Something like the following should get you started (although I don't 100% understand the relationship between
pm_data
and pm_info
): 像下面这样的东西应该让你开始(虽然我不是100%理解
pm_data
和pm_info
之间的关系):
SELECT pm_info.is_read, sender.usrFirst + ' ' + sender.usrLast as sender_name,
pm_data.date_sent, pm_data.title, pm_data.thread_id
FROM pm_info
INNER JOIN pm_data ON pm_info.thread_id = pm_data.thread_id
INNER JOIN tblUsers AS sender ON pm_data.sender_id = tblUsers.usrID
WHERE pm_info.receiver_id = @USER_ID /*in this case, 2*/
ORDER BY pm_data.date_sent DESC
I'm assuming the relation between pm_data
and pm_info
is the thread id. 我假设
pm_data
和pm_info
之间的关系是线程ID。 If it isn't, you should be able to adjust the above to whatever you need. 如果不是,您应该能够将上述内容调整为您需要的任何内容。 I've also sorted by date sent here, but it won't keep the threads together .
我也按照这里发送的日期排序,但它不会保持线程在一起 。 I'm not sure if you want to keep them together or not from the way you've phrased your question.
我不确定你是否愿意将它们放在一起或不同意你的问题。
If you want to keep threads together , you'll need a more complicated query: 如果要将线程保持在一起 ,则需要更复杂的查询:
SELECT pm_info.is_read, sender.usrFirst + ' ' + sender.usrLast as sender_name,
pm_data.date_sent, pm_data.title, pm_data.thread_id
FROM pm_info
INNER JOIN pm_data ON pm_info.thread_id = pm_data.thread_id
INNER JOIN tblUsers AS sender ON pm_data.sender_id = tblUsers.usrID
INNER JOIN (SELECT thread_id, MAX(date_sent) AS max_date
FROM pm_data
GROUP BY thread_id) AS most_recent_date
ON pm_data.thread_id = most_recent_date.thread_id
WHERE pm_info.receiver_id = @USER_ID /*in this case, 2*/
ORDER BY most_recent_date.max_date DESC, pm_data.thread_id,
pm_data.date_sent DESC
This query uses a subselect to find the most recent modified date for each thread, then sorts by this first. 此查询使用子选择查找每个线程的最新修改日期,然后按此排序。
To get the list of messages for a user along with who and when they sent it, you can use the following query: 要获取用户的消息列表以及发送消息的人员和时间,您可以使用以下查询:
select
s.usrFirst + ' ' + s.usrLast as SenderName,
m.Title,
m.DateSent,
i.IsRead
from
tblUsers r
inner join pm_info i on
r.receiver_id = i.receiver_id
inner join pm_data m on
i.thread_id = m.thread_id
inner join tblUsers s on
m.sender_id = s.userID
where
r.usrid = @id
This takes advantage of the fact that you can join a table to itself (here, tblUsers
shows up twice: Once for the recipient, and again for the sender). 这可以利用您可以将表连接到自身的事实(此处,
tblUsers
显示两次:一次为收件人, tblUsers
一次为发件人)。
If you'd like to see only unread messages, you can put and i.IsRead = 0
in the where
clause. 如果您只想查看未读消息,可以在
where
子句中输入and i.IsRead = 0
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.