高级不同SQL查询的问题

时间:2009-12-16 17:24:11

标签: sql mysql

好的,这个真的很棘手:D

我有一张这张桌子

bills_products:
- bill_id - product_id - action -
|    1    |      4     |   add  |
|    1    |      5     |   add  |
|    2    |      4     | remove |
|    2    |      1     |   add  |
|    3    |      4     |   add  |

你可以看到id为4的产品已在账单1中添加,然后在账单2中删除,并在账单3中再次添加

所有帐单都属于bill_group。但为简单起见,我们假设所有账单都属于同一组。

现在我需要一个SQL查询,显示当前在该组中添加的所有产品。

在这个例子中,它将是5,1和4.如果我们删除ID为3且5和1的账单

我尝试用DISTINCT做到这一点,但它不够强大,或者我做错了。

3 个答案:

答案 0 :(得分:3)

这似乎至少在SQL Server中起作用:

select  product_id
from    (
            select product_id,
                   sum((case when action='add' then 1 else -1 end)) as number
            from   bills_products
            group by product_id
        ) as counts
where   number > 0

答案 1 :(得分:0)

SELECT DISTINCT product_id FROM bills_products WHERE action = 'add';

答案 2 :(得分:0)

GSto几乎拥有它,但您必须ORDER BY bill_id DESC以确保您获得最新记录。

SELECT DISTINCT product_id FROM bills_products
WHERE action = 'add'
ORDER BY bill_id DESC;

(PS我想大多数人会说最好的做法是在这样的表格上设置一个时间戳列,你需要知道“最新”行是什么。你不能总是只依赖于ID 。)