简体   繁体   English

MySQL选择JOIN 3 Tables

[英]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_datapm_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_datapm_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM