具有WHERE子句的多表联接

时间:2013-02-12 10:31:23

标签: mysql database where multiple-tables

我正在使用Mysql,我很难尝试从SELECT查询中获取结果。 我有3张桌子。第一个表部分,第二个表部分成员和第三个表部分成员状态(此表中的数据是静态的)。

select * from Sections;

| section_id | title  | description | section_ownerid |
-------------------------------------------------------
| 1          | title1 | desc1       | 100             |
| 2          | title2 | desc2       | 100             |
| 3          | title3 | desc3       | 100             |
| 4          | title4 | desc4       | 100             |
| 5          | title5 | desc5       | 100             |
| 6          | title6 | desc6       | 100             |

select * from SectionMembers;

| SectionMembers_id | section_id  | status_code | memberid |
------------------------------------------------------------
| 1                 | 1           | 10          | 200      |
| 2                 | 1           | 20          | 300      |
| 3                 | 2           | 30          | 200      |
| 4                 | 2           | 10          | 300      |
| 5                 | 3           | 30          | 200      |
| 6                 | 4           | 20          | 200      |

select * from MemberStatus;

| MemberStatus_id | status_code  | status         |
---------------------------------------------------
| 1               | 10           | PENDINGMEMBER  |
| 2               | 20           | ACTIVEMEMBER   |
| 3               | 30           | MEMBERREJECTED |

我使用连接来获得结果

select distinct(a.section_id) as id,
        a.title,
        a.description,
        c.status
 from Sections a 
 left join SectionMembers b on a.section_id = b.section_id
 inner join MemberStatus c on b.status_code = c.status_code
 where (a.section_ownerid = 100 and b.memberid = 200)
       or (a.section_ownerid = 100); 

但我得不到正确的结果。我想要的结果如下所示:

| section_id | title  | description | status         |
------------------------------------------------------
| 1          | title1 | desc1       | PENDINGMEMBER  |
| 2          | title2 | desc2       | ACTIVEMEMBER   |
| 3          | title3 | desc3       | MEMBERREJECTED |
| 4          | title4 | desc4       | ACTIVEMEMBER   |
| 5          | title5 | desc5       | NULL           |
| 6          | title6 | desc6       | NULL           |

2 个答案:

答案 0 :(得分:18)

以下查询似乎就是您所需要的。请注意,memberid = 200的过滤器已移至连接条件:

select s.section_id,
  s.title,
  s.description,
  m.status
from Sections s
left join SectionMembers sm
  on s.section_id = sm.section_id
  and sm.memberid = 200
left join MemberStatus m
  on sm.status_code = m.status_code
where s.section_ownerid = 100;

注意:虽然您所需的结果显示section_id=2状态为ActiveMember,但您的示例数据无法将此值链接到第2部分。 < / p>

此查询给出结果:

| SECTION_ID |  TITLE | DESCRIPTION |         STATUS |
------------------------------------------------------
|          1 | title1 |       desc1 |  PendingMember |
|          2 | title2 |       desc2 | MemberRejected |
|          3 | title3 |       desc3 | MemberRejected |
|          4 | title4 |       desc4 |   ActiveMember |
|          5 | title5 |       desc5 |         (null) |
|          6 | title6 |       desc6 |         (null) |

答案 1 :(得分:0)

你走了:

SELECT s.section_id, s.title, s.description, ms.status 
FROM Sections as s
LEFT JOIN SectionMembers as sm ON s.section_id = sm.section_id
LEFT JOIN MemberStatus as ms ON ms.status_code = sm.status_code
WHERE (s.section_ownerid = 100 and sm.memberid = 200)
   OR (s.section_ownerid = 100)
GROUP BY section_id

注意:更新了我的回答