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