MYSQL 连接两个具有相同字段值的 table 字段,但如果另一个字段与另一个字段不匹配,仍将包含

MYSQL Join two table fields with same field value but will still include if the other field doesn't match the other one

我今天阅读了很多 MYSQL 组合表,但其中 none 符合我的问题。谁能帮我实现我想要的结果,如下所示?

TABLE 1:

|--------------------|
|        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...     |
|--------------------|

TABLE 2:

|--------------------|
|        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 我有以下查询,我尝试了很多查询组合但没有得到。

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`

我对该查询的问题是我使用:

     ON `tbl2`.`year` = `tbl1`.`year`

这只会 return 比赛年份。是的,我卡住了。

期望的结果:

|----------------------------|
|     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 脚本来完成此操作,但我更关心的是查询..

您正在 MySQL 寻找 FULL OUTER JOIN = LEFT + RIGHT JOIN:

SELECT *
FROM tbl1
LEFT JOIN tbl2 ON tbl1.user_id = tbl2.user_id
    AND tbl1.year = tbl2.year

UNION

SELECT *
FROM tbl1
RIGHT JOIN tbl2 ON tbl1.user_id = tbl2.user_id
    AND tbl1.year = tbl2.year

完整答案为:

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