2016-01-22 47 views
1

我懷疑是否可以解決問題。如何將兩個sql與不存在相結合?

TEST_TABLE:

id  | name | value | date 
---------|---------|---------|------------ 
1  | john | 32 | 2016-01-08 
2  | tom | 590 | 2016-01-03 
3  | king | 1903 | 2016-01-01 
4  | john | 490 | 2016-01-02 
5  | gary | 58 | 2016-01-18 
6  | cat | 5 | 2016-01-10 

SQL1:

select name,sum(value) as val from test_table where val > 500 group by name; 

SQL2:

select name from test_table where date >= DATE_SUB(CURDATE(),INTERVAL 1 WEEK) group by name; 

我想在一個組合兩個SQL。 sql2名稱結果集合中不存在sql結果名稱。

更新:

對不起,我困惑的描述。

的SQL1是掃描整個表,它的目標是找出誰的總價值超過500

的SQL2被掃描上週的數據,找出上週誰存在。

因此,我想結合兩個SQL,找出那些總價值大於500但上週不存在的人。

對不起,我的英語不好。

更新 - 添加例如:

就像表中的內容,其結果應該是:

約翰,湯姆,王

,因爲他們的總價值爲> 500,但上週未更新

但我該怎麼做。

謝謝大家。

+0

你想在這一行說什麼 - > SQL結果名稱不存在於SQL2名稱結果集合。 –

+0

@VigneswaranS這意味着sql結果中不存在sql結果。我想找出誰沒有更新lastweek,但他的價值是大於500.謝謝,問題描述已經更新 – iameven

回答

1
SELECT name, sum(value) 
FROM test_table 
WHERE value > 500 
AND name NOT IN (
    SELECT name 
    FROM test_table 
    WHERE `date` >= DATE_SUB(CURDATE(), INTERVAL 1 WEEK) 
) 
GROUP BY 1 

OR

SELECT name, sum(value) 
FROM test_table 
WHERE value > 500 
GROUP BY 1 
HAVING max(`date') < DATE_SUB(CURDATE(), INTERVAL 1 WEEK) 

如果你想有總和(值)> 500,刪除上述行

WHERE value > 500 

而變化WHERE第一個SQL

,並在每個以上的末尾添加下面一行:

having sum(value) > 500 
+0

謝謝你的回答,但你的SQL結果是找出用戶上週之前誰的價值超過500。但我只想在上週之前找出誰存在。 – iameven

+0

我簡化了你的問題,我認爲我的解決方案與你請求的 – SIDU

+0

完全一樣,我剛剛添加了這個例子,對於我的表格內容,結果應該是john,tom,king,但是你的sql結果只是tom和king。所以,我希望上週沒有更新的人員,而不是上個星期值> 500且不更新的人員。 – iameven

0

描述您想要的內容以及提供SQL示例非常有幫助。對於在過去一週中沒有日期行的名稱,您似乎希望值的總和大於500。

如果是這樣的:

select name, sum(case when value > 500 then value else 0 end) 
from test_table 
where value > 500 
group by name 
having max(date) < DATE_SUB(CURDATE(), INTERVAL 1 WEEK) ; 
+0

謝謝你的回答,更新descibe – iameven