MYSQL Join two table fields with same field value but will still include if the other field doesn't match the other one
我今天已经读过很多MYSQL组合表,但是没有一个适合我的问题。谁能帮我实现我的愿望结果,如下所示?
表1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |--------------------| | tbl1 | |--------------------| |user_id|points|year | |--------------------| | 1 | 3.2 | 2001| | 1 | 2.2 | 2002| | 1 | 3.8 | 2003| | 1 | 3.6 | 2005| | 2 | 1.2 | 2001| | 2 | 1.2 | 2002| | 2 | 1.2 | 2003| | *etc... | |--------------------| |
表2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |--------------------| | tbl2 | |--------------------| |user_id|amount|year | |--------------------| | 1 | 6.2 | 2001| | 1 | 9.2 | 2002| | 1 | 2.8 | 2003| | 1 | 7.6 | 2004| | 2 | 3.2 | 2001| | 2 | 8.2 | 2002| | 2 | 6.2 | 2003| | *etc... | |--------------------| |
我只想获取user_id1
我有以下查询,我尝试了许多查询组合,但没有得到任何结果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | SELECT `tbl1`.`points`, `tbl2`.`amount`, `tbl1`.`year` FROM ( SELECT * FROM `tbl1` WHERE `user_id` = 1 ORDER BY `year` DESC ) AS `tbl1` INNER JOIN ( SELECT * FROM `tbl2` WHERE `user_id` = 1 ORDER BY `year` DESC ) AS `tbl2` ON `tbl2`.`year` = `tbl1`.`year` |
我对该查询的问题是我使用了:
1 | ON `tbl2`.`year` = `tbl1`.`year` |
,它将仅返回比赛年份。所以是的,我被卡住了。
所需结果:
1 2 3 4 5 6 7 8 9 10 11 12 | |----------------------------| | JOINED/COMBINED | |----------------------------| |user_id|amount|points| year | |----------------------------| | 1 | 6.2 | 3.2 | 2001 | | 1 | 9.2 | 2.2 | 2002 | | 1 | 2.8 | 3.8 | 2003 | | 1 | 7.6 | Null | 2004 | | 1 | Null | 3.6 | 2005 | | *etc... | |----------------------------| |
在这种情况下,问题在于table2具有2004,而table1具有2005,而两者都没有。但我仍然想按年份显示它们的顺序。
如果仅靠查询不能完成它,我也将接受PHP脚本来完成这项工作,但查询是我在这里更关心的问题。
您正在寻找
1 2 3 4 5 6 7 8 9 10 11 |
完整答案将是:
1 2 3 4 5 6 7 8 9 10 11 12 | select user_id, sum(points) as poins, sum(amount) as amount, year from ( SELECT tbl1.user_id, tbl1.points, tbl2.amount, tbl1.year FROM tbl1 LEFT JOIN tbl2 ON tbl1.user_id = tbl2.user_id AND tbl1.year = tbl2.year UNION SELECT tbl2.user_id,tbl1.points , tbl2.amount, tbl2.year FROM tbl1 RIGHT JOIN tbl2 ON tbl1.user_id = tbl2.user_id AND tbl1.year = tbl2.year) tables group by year order by year |