2012-02-25 101 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