2016-12-02 57 views
2

有三列最後獲得第一次插入零進入MySQL的

ID User  Quantity Date 
1 x  0  2016-01-01 
2 x  2  2016-01-02 
3 x  0  2016-01-03 
4 x  0  2016-01-04 
5 xx  0  2016-01-01 
6 xx  2  2016-01-02 
7 xx  0  2016-01-03 
8 xx  8  2016-01-04 
9 xx  0  2016-01-06 
10 xx  0  2016-01-04 

現在我該怎樣獲取用戶明智的第0項爲X的用戶ID = 3,XX ID = 9的最新序列。

+0

'SELECT *在哪裏ID = 9或ID = 3'? – ColinM

+0

否..我需要基於用戶名的查詢...需要所有用戶或單獨用戶使用他們的最後第一個插入的零記錄詳細信息 –

+0

對於x用戶,如何使用id作爲最後一個插入的0是由id 4. – Nitin

回答

1

這有點複雜,因爲我們需要爲名稱找到最後一個不是0的條目。 (我會自然地傾向於按日期排序,但你說的ID是去什麼。)

SELECT t1.name, max(t1.id) as check_id FROM table t1 WHERE quantity > 0 GROUP BY name 

現在,你可以得到的最低數量大於給定check_id更高的每個名字:

SELECT name, min(t2.id) FROM table t2 
JOIN (SELECT t1.name, max(t1.id) as check_id FROM table t1 WHERE quantity > 0 GROUP BY name) as a ON a.name=t2.name 
WHERE t2.quantity = 0 AND t2.id > a.id 
GROUP BY t2.name 

有一個問題。它將排除只有0數量的每個人。如果這可能發生,你需要用下面的代碼另一個查詢(只得到0值)

SELECT name, min(id) as check_id, sum(quantity) as qty_sum FROM table 
GROUP BY name 
HAVING qty_sum = 0 
+0

它的工作原理。發佈問題時我保留你的建議。 TY。 –

+0

@Manoj你願意比我的答覆upvote並將其標記爲正確 – Seb

0

如前所述,第一步是由每一個用戶一個積極的數量,以確定最後的數據集。所有以下數據集的最低ID將是您所尋找的。換句話說,您需要查找所有正數條目的MAX(ID),並在ID較高的所有條目上應用MIN(ID)。在一個查詢:

SELECT `User`, MIN(`ID`) FROM t `mainquery` 
WHERE `ID` > (
    SELECT MAX(`ID`) FROM t `subquery` 
    WHERE `Quantity` > 0 AND `mainquery`.`User` = `subquery`.`User` 
    GROUP BY `User` 
) 
GROUP BY `User` 

與您的例子中的數據,該查詢返回:

User MIN(`ID`) 
x  3 
xx  9 

測試在這裏:http://sqlfiddle.com/#!9/3c487/1/0

+0

它的工作原理...謝謝 –

0

試試這個:

SELECT t1.user,min(t1.id) as ID,quantity,date from tablename t1 
JOIN 
(SELECT MAX(id) as qid,user FROM tablename WHERE Quantity>0 GROUP BY user) t2 
ON t2.user=t1.user 
WHERE t1.id>t2.qid 
AND t1.Quantity=0 
GROUP BY t1.user