2017-07-18 72 views
1

我在mysql数据库中有3个表。像组,成员,消息一样。从不同表中选择多行

| group_id | group_name | group_image 
------------------------------------------- 
| group_1 | First Group | group1.jpg 
| group_2 | 2nd Group | group2.jpg 
| group_3 | 3rd Group | group3.jpg 
| group_4 | 4th Group | group4.jpg 
| group_5 | 5th Group | group5.jpg 
| group_6 | 6th Group | group6.jpg 

消息

| sender_id | group_id | message | time 
----------------------------------------- 
| 001 | group_1 | first message | 2017-07-13 15:05:07 
| 002 | group_2 | fifth message | 2017-07-13 15:04:07 
| 002 | group_2 | third Message | 2017-07-13 15:03:07 

GroupsMembers

| user_id | group_id 
----------------------------------------- 
| 001 | group_1 
| 001 | group_2 
| 002 | group_2 
| 002 | group_1 
| 002 | group_4 
| 002 | group_6 

我与这个问答尝试uery

SELECT mmbr.group_id, grp.group_name, grp.group_image, msg.time, msg.message FROM `GroupsMembers` AS mmbr JOIN `Messages` AS msg ON msg.group_id =mmbr.group_id AND msg.time = (SELECT MAX(time) FROM `Messages` WHERE group_id = mmbr.group_id) JOIN `Groups` AS grp ON grp.group_id = mmbr.group_id WHERE mmbr.user_id = '002' 

它给了我下面的结果: -

| group_id | group_name | group_image | time    | message | 
------------------------------------------------------------------------ 
| group_1 | First Group | group1.jpg | 2017-07-13 15:05:07 | first message 
| group_2 | 2nd Group | group2.jpg | 2017-07-13 15:04:07 | fifth message 

需要所有用户ID的'002'消息没有东西这样: -
需要最后发送消息如果任何

| group_id | group_name | group_image | time    | message | 
------------------------------------------------------------------------ 
| group_1 | First Group | group1.jpg | 2017-07-13 15:05:07 | first message 
| group_2 | 2nd Group | group2.jpg | 2017-07-13 15:04:07 | fifth message 
| group_4 | 4th Group | group4.jpg | null    | null 
| group_6 | 6th Group | group6.jpg | null    | null 
+2

你试过'LEFT JOIN'吗? – jarlh

+0

还没有。感谢您的建议。让我试试LEFT JOIN,然后我会在这里更新。 –

+0

谢谢@jarlh。 LEFT JOIN起作用。 –

回答

-2

考虑使用LEFT JOIN

SELECT mmbr.group_id, grp.group_name, grp.group_image, msg.time, msg.message FROM `GroupsMembers` AS mmbr 
JOIN `Groups` AS grp ON grp.group_id = mmbr.group_id 
LEFT JOIN `Messages` AS msg ON msg.group_id =mmbr.group_id AND msg.time = (SELECT MAX(time) FROM `Messages` WHERE group_id = mmbr.group_id) 
WHERE mmbr.user_id = '002' 

阅读本教程https://www.w3schools.com/sql/sql_join_left.asp

+1

它给mysql错误“子句的意外排序。(接近WHERE)“ –

+0

立即尝试,对不起,因为错误 –

+1

谢谢@Joey Pinto。我只是把WHERE子句放在最后,它的工作原理 –

0

尝试使用LEFT OUTER JOIN:

SELECT mmbr.group_id, 
     grp.group_name, 
     grp.group_image, 
     msg.time, 
     msg.message 
FROM `GroupsMembers` AS mmbr 
JOIN `Groups` AS grp 
    ON grp.group_id = mmbr.group_id 
LEFT OUTER JOIN `Messages` AS msg 
      ON msg.group_id = mmbr.group_id 
      AND msg.time = (SELECT MAX(time) 
          FROM `Messages` 
          WHERE group_id = mmbr.group_id) 
WHERE mmbr.user_id = '002'; 
-2

应用LEFT JOIN。

尝试此

SELECT mmbr.group_id,grp.group_name,grp.group_image,msg.time,msg.message FROM GroupsMembers AS mmbr LEFT JOIN消息AS msg ON msg.group_id =mmbr.group_id AND msg.time = (SELECT MAX(time) FROM消息WHERE group_id = mmbr.group_id) LEFT JOIN Groups` AS GRP ON grp.group_id = mmbr.group_id WHERE mmbr .user_id ='002'

+0

请正确格式化您的答案 –