2013-02-12 17 views
5

Sto utilizzando Mysql e sto avendo difficoltà a cercare di ottenere i risultati da una query SELECT. Sto avendo 3 tavoli. Prime sezioni della tabella, membri della sezione della seconda tabella e stato membro della sezione della terza tabella (i dati in questa tabella sono statici).Più tabelle join con clausola WHERE

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 | 

ho usato si unisce per ottenere risultati come

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); 

Ma io non sto ottenendo risultato corretto. Voglio risultati come illustrato di seguito:

| 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   | 

risposta

11

Sembra che la seguente query è quello che ti serve. Si noti che il filtro per memberid = 200 è stata spostata alla condizione di join:

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; 

Nota: mentre il risultato desiderato mostra che section_id=2 ha uno status di ActiveMember non c'è modo nei vostri dati di esempio per rendere questo link valore sezione 2.

Questa query dà il risultato:

| 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) | 
+0

questo ha funzionato perfettamente. Grazie bluefeet. – Bhargav

+0

@BhargavBonu sei il benvenuto! :) – Taryn

+0

Questo ha aiutato! Grazie !! 1 – normalUser

0

Qui si va:

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 

Nota: aggiornato la mia risposta