MySQL FULL JOIN一个表,并在同一个查询中LEFT JOIN另一个表?

Dan*_*eri 5 php mysql join

我有三个表,我想在这一个查询中链接.

该脚本是一个出勤登记簿,因此它为每个用户记录每次会议的出勤标记.

使用的三个表:

"球队":

id | fullname | position         | class | hidden
1  | Team     | --               | black | 1
2  | Dan S    | Team Manager     | green | 0
3  | Harry P  | Graphic Engineer | blue  | 0
Run Code Online (Sandbox Code Playgroud)

"寄存器":

id | mid | uid | mark
1  | 1   | 2   | /
2  | 1   | 3   | I
3  | 2   | 1   | /
4  | 2   | 3   | /
Run Code Online (Sandbox Code Playgroud)

"会议":

id | maintask            | starttime  | endtime
1  | Organise Year Ahead | 1330007400 | 1330012800
2  | Gather Ideas        | 1330612200 | 1330617600
3  | TODO                | 1331217000 | 1331222400
Run Code Online (Sandbox Code Playgroud)

有一个数据样本.我想做的是:

从寄存器中选择所有结果,由用户对它们进行分组,然后按会议开始时间对它们进行排序.但是,如果寄存器表中没有标记,我希望它显示" - "(如果需要可以通过php完成)所以预期结果如下:

fullname | mark | mid
Dan S    | /    | 1
Dan S    | /    | 2
Dan S    | -    | 3
Harry P  | I    | 1
Harry P  | /    | 2
Harry P  | -    | 3
Run Code Online (Sandbox Code Playgroud)

我的SQL查询目前是这样的:

选择你.fullname,U.id河.mark河.midteam你完全加入registerr ON.uid= U.idLEFT JOIN meetingsm ON r.mid=米.idGROUP BY你.id订购m.starttimeASC

我从MySQL收到错误:

您的SQL语法有错误; 检查与您的MySQL服务器版本对应的手册,以便在'FULL JOIN registerr ON r '附近使用正确的语法.uid= U.idLEFT JOIN meetingsm ON r.mid在第1行= m .id'

但是,我无法看到它的问题: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
Run Code Online (Sandbox Code Playgroud)

dan*_*era 4

Full outer joinMySQL 不支持。至少到5.6版本,您可以查看MySQL Join doc。Across join可能是一个解决方法:

编辑

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
Run Code Online (Sandbox Code Playgroud)

让我知道这是否可以解决您的问题。


一个简化:

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
Run Code Online (Sandbox Code Playgroud)