关于php:MYSQL将具有相同字段值的两个表字段联接在一起,但是如果另一个字段与另一个字段不匹配,则仍将包括

 2021-04-18 

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脚本来完成这项工作,但查询是我在这里更关心的问题。


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

1
2
3
4
5
6
7
8
9
10
11
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


完整答案将是:

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