2016-12-02 2 views
2

今私は、最新のXユーザID = 3のための0のエントリの順序、XX ID = 9のユーザが賢明が最初に取得するにはどうすればよいの3つの列最終最初に挿入ゼロエントリ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

'SELECT * WHERE ID = 9またはID = 3'? – ColinM

+0

いいえ..ユーザー名に基づいてクエリが必要です。すべてのユーザーが必要です。最後に最初にゼロレコードの詳細が挿入されている必要があります。 –

+0

xユーザーの場合、最後に挿入されたIDは3です。idは4です。 – Nitin

答えて

1

名前の最後の0でないエントリを見つける必要があるため、少し複雑です。 (私は自然に日付でソートする傾向があるが、あなたはIDがために行くために何であると述べた。)あなたが与えられたcheck_idよりも高くなっている名前ごとに最低数を取得することができます

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

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 

問題が1つあります。 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)を適用する必要があります。 1つのクエリでは:あなたの例からのデータで

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 
関連する問題