简体   繁体   English

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

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

i have three tables i would like to link in this one query. 我有三个表,我想在这一个查询中链接。

The script is an attendance register, so it records an attendance mark for each meeting, per user. 该脚本是一个出勤登记簿,因此它为每个用户记录每次会议的出勤标记。

The three tables used: 使用的三个表:

"team": “球队”:

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

"register": “寄存器”:

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

"meetings": “会议”:

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

There is a sample of the data. 有一个数据样本。 What i want to do is: 我想做的是:

Select all the results from the register, group them by the user, and order them by the meeting start time. 从寄存器中选择所有结果,由用户对它们进行分组,然后按会议开始时间对它们进行排序。 But, if there is not a mark in the register table, i want it to display "-" (can be done via php if needed) So an expected result like so: 但是,如果寄存器表中没有标记,我希望它显示“ - ”(如果需要可以通过php完成)所以预期结果如下:

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

My SQL Query is this at the moment: 我的SQL查询目前是这样的:

SELECT u. 选择你。 fullname ,u. fullname ,你。 id ,r. id ,r。 mark ,r. mark mid FROM team u FULL JOIN register r ON r. mid FROM team u FULL JOIN register r ON r。 uid =u. uid =你。 id LEFT JOIN meetings m ON r. id LEFT JOIN meetings M于河 mid =m. mid = m。 id GROUP BY u. id GROUP BY你。 id ORDER BY m. id ORDER BY m。 starttime ASC starttime ASC

And i get an error back from MySQL: 我从MySQL收到错误:

You have an error in your SQL syntax; 您的SQL语法有错误; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FULL JOIN register r ON r. 检查与您的MySQL服务器版本对应的手册,以便在'FULL JOIN register r ON r附近使用正确的语法。 uid =u. uid =你。 id LEFT JOIN meetings m ON r. id LEFT JOIN meetings M于河 mid =m.`id' at line 1 mid = m .id'在第1行

But, i cant see an issue with it :S 但是,我无法看到它的问题:S

Please could someone help out, point me in the right direction or give me a possible solution to this. 请有人帮忙,指出正确的方向或给我一个可能的解决方案。 Much Appreciated 非常感激

Dan

Answer: Query that worked: 答案:查询有效:

   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

Full outer join is not supported by MySQL. MySQL不支持Full outer join At least to version 5.6, you can check MySQL Join doc . 至少到5.6版,您可以查看MySQL Join doc A cross join may be a workaround: cross join可能是一种解决方法:

EDITED 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

Let me know if this solve your issue. 如果这可以解决您的问题,请告诉我。


A simplification: 简化:

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