2009-12-16 8 views
1

Ok это одно действительно сложна: DПроблемы с усовершенствованным отчетливым SQL запросом

У меня есть эта таблица

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

как вы можете видеть продукт с идентификатором 4 был добавлен в счете-затем удаляется в счет 2 и снова добавлен в счет 3

Все счета принадлежат к bill_group. Но для простоты предположим, что все счета находятся в одной группе.

Теперь мне нужен SQL-запрос, который отображает все продукты, которые в настоящее время добавлены в эту группу.

В этом примере будет 5, 1 и 4. Если бы снять законопроект с идентификатором 3, который будет 5 и 1

Я пытался сделать это с помощью DISTINCT, но это не достаточно мощный или возможно, я делаю это неправильно.

+0

, но product_id 4 все еще добавляется к счету 1, так что он все еще будет там? – GSto

+0

Да, это проблема! – antpaw

ответ

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 
+0

Предполагая, что вы уже защищены от нескольких событий удаления, например, «добавить, удалить, удалить, добавить». –

+0

Это правда, что я предположил, что они не могут удалить вещи, которые уже были удалены. – Rich

+0

Почему? Он должен работать даже с несколькими ударами или мне что-то не хватает? –

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

это не будет работать, если вы удалите счет 3, он покажет вам product_id 4, но он был удален в счете 2. – antpaw

+0

ах, я неправильно понял вопрос. – GSto

0

GSto чуть было, но вы должны ORDER BY bill_id DESC, чтобы убедиться, что вы получите последние записи.

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

(PS Я думаю, что большинство людей говорят, что это лучшая практика, чтобы иметь столбец временной метки на столах, как это, где вы должны быть в состоянии знать, что «новейший» строка. Вы не можете всегда полагаться по ids только по возрастанию.)

Смежные вопросы