2016-12-02 38 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