Php MySQL完全联接一个表,并在同一查询中左联接另一个表?

Php MySQL完全联接一个表,并在同一查询中左联接另一个表?,php,mysql,join,Php,Mysql,Join,我有三个表要在这个查询中链接 该脚本是一个考勤登记簿,因此它会记录每个用户每次会议的考勤标记 使用的三个表格: “团队”: “登记册”: “会议”: 有一个数据样本。我想做的是: 从注册表中选择所有结果,按用户分组,并按会议开始时间排序。但是,如果register表中没有标记,我希望它显示“-”(如果需要,可以通过php完成),因此预期结果如下: fullname | mark | mid Dan S | / | 1 Dan S | / | 2 Dan S | -

我有三个表要在这个查询中链接

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

使用的三个表格:

“团队”:

“登记册”:

“会议”:

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

从注册表中选择所有结果,按用户分组,并按会议开始时间排序。但是,如果register表中没有标记,我希望它显示“-”(如果需要,可以通过php完成),因此预期结果如下:

fullname | mark | mid
Dan S    | /    | 1
Dan S    | /    | 2
Dan S    | -    | 3
Harry P  | I    | 1
Harry P  | /    | 2
Harry P  | -    | 3
目前我的SQL查询如下:

团队中选择u.
fullname
、u.
id
、r.
mark
、r.
mid
,r.
u.
uid
注册 r、
mid
=m.
id
按u.分组
id
按m.排序
starttime
ASC

我从MySQL中得到一个错误:

您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 接近“完全连接
注册
r上的r.
uid
=u.
id
左连接
会议
m 在第1行的r.
mid
=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

MySQL不支持完全外部联接。至少到版本5.6,您可以检查。
交叉连接可能是一种解决方法:

已编辑

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

在o.o之前,我在MySQL中使用过它。我肯定我有——也许没有,可能会与左外连接或其他东西混淆。我可以用什么来代替完全外部连接来做同样的事情呢?Google for
simulate full outer join mysql
获取一些在mysql中确实不存在的
full outer join
解决方案。非常感谢,交叉连接非常有效:)(出于某种原因,我无法将其标记为已接受的答案o.o)啊,它似乎只选择m.id=1:S的数据。寄存器表中有一个使用m.id=2:S的条目:S@DanSpiteri,我认为正确的解决方案是团队和会议之间的交叉连接,我将重写查询。等待
   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
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