高级独立SQL查询存在问题

高级独立SQL查询存在问题,sql,mysql,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

好的,这个真的很棘手: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中再次添加

所有票据都属于一个票据组。但是为了简单起见,让我们假设所有的账单都在同一组

现在我需要一个SQL查询来显示当前添加到此组的所有产品

在这个例子中是5,1和4。如果我们删除id为3的票据,则为5和1


我曾尝试使用DISTINCT来实现这一点,但它的功能不够强大,或者可能是我做错了。

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

SELECT DISTINCT product_id FROM bills_products WHERE action = 'add';
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

GSto差一点就拿到了,但您必须按bill_id DESC下单以确保获得最新记录

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

(另外,我想大多数人都会说,在这样的表上设置一个时间戳列是一种最佳做法,您需要知道“最新”行是什么。您不能总是只依赖id升序。)

但是产品id 4仍然添加到账单1中,那么它是否仍然存在?如果删除账单3,这将不起作用,它将向您显示产品id 4,但它在清单2中被删除。啊,我误解了这个问题。假设您已经针对多个删除事件进行了保护,例如“添加、删除、删除、添加”。我确实假设他们无法删除已删除的内容。为什么?它甚至可以与多个删除一起工作,或者我错过了什么吗?哇,谢谢!我没有将动作字符串硬编码到此表中(只是为了更好地演示),它实际上是一个fk_动作id。您能告诉我如何进行连接以获取动作字符串吗?假设有人删除一个项目两次,然后添加一次。总和为-1,并且该项不会被列出,如果最小值为0,则应为该值。