1

私は次のテーブルを持っています:

actions(id, name)
orders(refno, po)
order_actions(order, action)

特定のアクションが実行されていないすべての注文を取得したいのですが。注文にはアクションが含まれる場合と含まれない場合があります。

アクションが適用されていないすべての注文を取得したいとすると13、これまでのところ、次のようなものがあります。

SELECT o.po, oa.action, 
    FROM orders AS `o`
    LEFT JOIN order_actions AS `oa` ON o.refno = oa.order
WHERE oa.action <> 13

13これはアクションのない注文ではうまく機能しますが、注文に誤検知が発生するのとは異なるアクションがある場合、poまたは追加の句のactionsテーブルを含む別の結合が欠落していますか?GROUP BYWHERE

どんな助けでも大歓迎です。

4

3 に答える 3

3
SELECT o.po, oa.action
FROM orders AS `o`
     LEFT JOIN order_actions AS `oa` ON o.refno = oa.order
WHERE NOT EXISTS (
  SELECT 1 
  FROM order_actions tmp 
  WHERE oa.order = tmp.order 
    AND tmp.action = '13'
)

デモ(sqlfiddle)。

于 2012-08-22T00:29:27.953 に答える
1

groupbyとhave句を使用してこの問題を解決することもできます。

SELECT o.refno, o.po
FROM orders AS `o` LEFT JOIN
     order_actions `oa`
     ON o.refno = oa.order
group by o.refno, o.po
having max(case when oa.action = 13 then 1 else 0 end) = 0

このような注文に対するすべてのアクションを追跡する場合は、group_concatを使用できます。

SELECT o.refno, o.po,
       group_concat(cast(ao.action) separator ', ') as AllOtherActions
FROM orders AS `o` LEFT JOIN
     order_actions `oa`
     ON o.refno = oa.order
group by o.refno, o.po
having max(case when oa.action = 13 then 1 else 0 end) = 0
于 2012-08-22T01:59:08.743 に答える
0

別の方法は次のとおりです。

select o.po
from orders as 'o'
    left join (
        select order from order_actions where [action] = @Action
        ) AS `oa` on o.refno = oa.order
where oa.order is null

これは、選択した注文のアクション番号を返しませんが、アクションがなかった注文を探しているだけであると述べています。ここでは、@Actionと呼びます。

于 2012-08-22T02:07:06.523 に答える