【问题标题】:MySQL FULL JOIN one table, and LEFT JOIN another in the same query?MySQL FULL JOIN 一个表,并在同一个查询中 LEFT JOIN 另一个?
【发布时间】:2012-03-15 17:00:33
【问题描述】:

我想在这个查询中链接三个表。

该脚本是一个出席记录,因此它记录每个用户的每个会议的出席标记。

用到的三个表:

“团队”:

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,u.id,r.mark,r.mid FROM team u FULL JOIN register r ON r.uid=u.id左连接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

【问题讨论】:

    标签: php mysql join


    【解决方案1】:

    Full outer join 不受 MySQL 支持。至少到 5.6 版本,您可以查看MySQL Join doccross 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
    

    如果这能解决您的问题,请告诉我。


    简化:

    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 中使用过它我确定我有 -- 也许没有,可能与 LEFT OUTER JOIN 或其他东西混淆了。我可以用什么来代替完全外连接来做同样的事情?
    • Google for simulate full outer join mysql 的一些解决方案 FULL OUTER JOIN 在 mysql 中确实不存在。
    • 非常感谢,CROSS JOIN 完美运行 :) (由于某种原因,我无法将其标记为已接受的答案 o.O)
    • 啊,它似乎只选择 m.id = 1 的数据:S 在使用 m.id = 2 的注册表中肯定有一个条目:S
    • @DanSpiteri,我认为正确的解决方案是团队和会议之间的交叉加入,我将重写查询。等等。
    猜你喜欢
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 2013-06-02
    • 2017-10-15
    • 1970-01-01
    相关资源
    最近更新 更多