2012-02-25 106 views
5

我有三個表我想鏈接在這一個查詢。MySQL FULL JOIN一個表,並且在同一個查詢中LEFT JOIN另一個表?

該腳本是一個考勤記錄器,因此它記錄每個用戶的每個會議的考勤標記。

這三個表中:

「團隊」:

id | fullname | position   | class | hidden 
1 | Team  | --    | black | 1 
2 | Dan S | Team Manager  | green | 0 
3 | Harry P | Graphic Engineer | blue | 0 

「註冊」:

id | mid | uid | mark 
1 | 1 | 2 |/
2 | 1 | 3 | I 
3 | 2 | 1 |/
4 | 2 | 3 |/

「會議」:

id | maintask   | starttime | endtime 
1 | Organise Year Ahead | 1330007400 | 1330012800 
2 | Gather Ideas  | 1330612200 | 1330617600 
3 | TODO    | 1331217000 | 1331222400 

有一個樣本的數據。我想要做的是:

從寄存器中選擇所有結果,由用戶將它們分組,並按照會議開始時間排序。但是,如果沒有在登記表中的標記,我希望它顯示「 - 」(如果需要的話可以通過PHP來實現),所以期望的結果,像這樣:

fullname | mark | mid 
Dan S |/ | 1 
Dan S |/ | 2 
Dan S | - | 3 
Harry P | I | 1 
Harry P |/ | 2 
Harry P | - | 3 

我的SQL查詢是這樣的片刻:

SELECT u。 fullname,你。 id,r。 mark,r。 midteam u完全加入register r ON r。 uid = u。 id LEFT JOIN meetings m ON r。 mid = m。 id GROUP BY u。 id ORDER BY m。 starttime ASC

,我得到一個錯誤回來從MySQL:

您的SQL語法錯誤;檢查手冊, 對應於您的MySQL服務器版本的正確語法使用 'FULL JOIN register r ON r。 uid = u。 id LEFT JOIN meetings m ON r。 mid = m.`id」在行1

但是,我看不到它的問題:S

請會有人幫幫忙,指出我在正確的方向,或給我一個可能的解決方案這個。非常感謝

答: 查詢工作:

SELECT  
     u.fullname, u.id as uid,  
     if(r.uid = u.id, r.mark, '-') as mark,  
     if(r.uid = u.id, r.mid, '-') as mid,  
     r.mid, m.starttime 
    FROM  
     team u 
     CROSS JOIN  
     register r ON u.id = r.uid 
     LEFT OUTER JOIN  
     meetings m ON r.mid = m.id 
    WHERE  
     u.hidden = 0 
    GROUP BY  
     u.id, r.mid 
    ORDER BY  
     m.starttime, u.id ASC 

回答

4

Full outer join沒有MySQL支持。至少到版本5.6,您可以檢查MySQL Join doc。一個cross join可能是一個解決辦法:

EDITED

SELECT 
    UxM.fullname, 
    r.mark, 
    UxM.mid, 
    UxM.starttime 
FROM 
    (select u.id as uid, m.id as mid, u.fullname, m.starttime 
    from 
    team u 
     CROSS JOIN 
    meetings) UxM 
    left join 
    register r 
     on UxM.uid = r.uid and UxM.mid = r.mid 
ORDER BY 
    UxM.starttime ASC 

讓我知道這是否解決您的問題。


簡化:

SELECT  
    u.fullname, 
    u.id AS uid,  
    COALESCE(r.mark, '-') AS mark,  
    COALESCE(r.mid, '-') AS mid,  
    m.id, 
    m.starttime 
FROM  
    team u 
     CROSS JOIN  
    meetings m 
     LEFT JOIN  
    register r 
     ON r.mid = m.id 
     AND r.id = u.uid 
WHERE  
    u.hidden = 0 
GROUP BY  
    m.id, u.id 
ORDER BY  
    m.starttime, u.id 
+0

伊夫用它在MySQL o.O之前,我敢肯定,我有 - 也許不是,也許就能得到混淆LEFT OUTER JOIN或東西。我可以使用什麼而不是完全的外連接來做同樣的事情? – 2012-02-25 13:30:29

+0

谷歌爲''模擬完整的外部連接mysql'爲'FULL OUTER JOIN'的某些解決方案確實不存在於mysql中。 – biziclop 2012-02-25 13:38:35

+0

非常感謝,CROSS JOIN工作完美:)(出於某種原因,我不能標記爲接受的答案o.O) – 2012-02-25 13:40:37