代码之家  ›  专栏  ›  技术社区  ›  antpaw

高级非重复SQL查询有问题

  •  1
  • antpaw  · 技术社区  · 15 年前

    好吧,这个真的很棘手: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

    我试过用不同的方法来做这个,但是它不够强大,或者我做的不对。

    3 回复  |  直到 15 年前
        1
  •  3
  •   Rich    15 年前

    这似乎至少在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
    
        2
  •  0
  •   GSto    15 年前
    SELECT DISTINCT product_id FROM bills_products WHERE action = 'add';
    
        3
  •  0
  •   Jordan Running    15 年前

    GSTO差点就拿到了,但你必须 ORDER BY bill_id DESC 以确保您获得最新的记录。

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

    (P.S.我认为大多数人都会说,在这样的表上有一个时间戳列是一种最佳实践,您需要知道“最新”行是什么。您不能总是只依赖ID升序。)