簡體   English   中英

MySQL FULL JOIN一個表,並在同一個查詢中LEFT JOIN另一個表?

[英]MySQL FULL JOIN one table, and LEFT JOIN another in the same query?

我有三個表,我想在這一個查詢中鏈接。

該腳本是一個出勤登記簿,因此它為每個用戶記錄每次會議的出勤標記。

使用的三個表:

“球隊”:

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查詢目前是這樣的:

選擇你。 fullname ,你。 id ,r。 mark mid FROM team u FULL JOIN register r ON r。 uid =你。 id LEFT JOIN meetings M於河 mid = m。 id GROUP BY你。 id ORDER BY m。 starttime ASC

我從MySQL收到錯誤:

您的SQL語法有錯誤; 檢查與您的MySQL服務器版本對應的手冊,以便在'FULL JOIN register r ON r附近使用正確的語法。 uid =你。 id LEFT JOIN meetings M於河 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

MySQL不支持Full outer join 至少到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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM