MYSQL加入两个具有相同数据的表

时间:2015-05-07 18:52:47

标签: php mysql left-join

我有两张表memberalumnialumni表可以在多行中具有相同的member且具有不同的year字段。我想从表中选择所有数据。 给出的表格是:

校友:

 id, regd, name,   status,    year

 1    1    kim     inactive   2013
 2    1    kim     inactive   2014
 3    1    kim     inactive   2015 //This is generated for alumni purpose

给出的表成员是:

regd, name,   status,    year
 1    kim     Active     2015

预期输出为:

`regd`, `name,`   `status,`    `year`
 1       kim       Active       2015 
 1       kim       inactive     2014 
 1       kim       inactive     2013

如果alumni中没有例如2015年的记录,它仍将显示alumnimember表格中的另一条记录。我试图用regd使用以下php和mysql语句来显示它,但它不能按预期工作。

MySQL的:

SELECT m.*, a.* FROM member m 
LEFT JOIN alumni a ON m.regd = a.regd
WHERE m.regd ='1' GROUP BY a.year ORDER BY a.year DESC;

PHP:

foreach($members as member):
echo $member['regd'].' '.$member['year'].'<br>';
endforeach;

错误是,它仅从alumni表中选择所有数据。哪里可能出错?虽然我没有在这里提供小提琴,但我希望这能说明我的观点。请帮帮我。

1 个答案:

答案 0 :(得分:0)

MySQL不支持OUTER JOIN

https://stackoverflow.com/a/4796911/4421474

所以你应该这样做:

SELECT res.* FROM (
SELECT 
m.regd, 
m.name, 
COALESCE(m.status, a.status),
m.year,
FROM member m 
LEFT JOIN alumni a 
ON m.regd = a.regd
   AND m.year = a.year
WHERE m.regd ='1' 
UNION
SELECT 
a.regd, 
a.name, 
a.status,
a.year,
FROM member m 
RIGHT JOIN alumni a 
ON m.regd = a.regd
   AND m.year = a.year
WHERE a.regd ='1' 
   AND m.regd IS NULL
) res
ORDER BY res.year DESC