2017-08-03 47 views
3

我今天已經閱讀了很多MYSQL組合表,但沒有一個符合我的問題。任何人都可以幫助我實現我的願望結果如下?MYSQL加入兩個具有相同字段值的表字段,但如果其他字段與另一字段不匹配,則仍然包含

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

表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` 

將只返回匹配的一年。所以是的,我卡住了。

期望的結果:

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

在這種情況下,問題是,表2 2004年有table1中同時擁有2005年兩者沒有其他。但我仍然希望按年份顯示它們。

如果它不能與查詢進行單獨我也將接受PHP腳本,使這個做,但查詢是我所關注這裏更多..

+4

那你試試這麼遠嗎?請向我們展示您的努力。 –

+3

聽起來像一個'OUTER JOIN'給我 – RealCheeseLord

+1

@diiN__________我編輯了我的問題。我添加了我自己的查詢,我嘗試了許多查詢之一。 –

回答

2

你正在尋找一個FULL OUTER JOIN = LEFT + RIGHT JOINMySQL

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 
+0

哇,這是一個總的救命。我從來沒有想過會這麼快。真的節省了我的時間。挖掘下來。謝謝@apomene –

+0

我只是添加WHERE tbl1.user_id = 1,因爲我只是在尋找1.謝謝。 :D –

+0

我只是有一個問題。當我執行查詢失蹤的一年變爲空。我是客人,因爲它將從tbl1到tbl2的年份合併爲NULL –

0

完整的答案是:

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 
相關問題