0

私は MySQL の完全な初心者なので、私の無知を許してください。

これでうまくいくと思ったのですが、そうではありません。

SELECT DISTINCT c_id
,       c_name
FROM    a_bkorders.bkv_CustOrders
WHERE   Date_Format(order_date, '%Y-%m') = @m_one
AND     c_id IN (
            SELECT DISTINCT c_id
            FROM    a_bkorders.bkv_CustOrders
            WHERE   Date_Format(order_date, '%Y-%m') = @m_two 
            XOR     Date_Format(order_date, '%Y-%m') = @m_three )
;

だから私は比較のためにこれを試しましたが、私が期待したものも返されません:

SELECT DISTINCT c_id
,       c_name
FROM    a_bkorders.bkv_CustOrders
WHERE   Date_Format(order_date, '%Y-%m') = @m_two 
XOR     Date_Format(order_date, '%Y-%m') = @m_three
;

私はおそらく単純で基本的なものを見落としていることを知っています。:-/誰かが私を正しい方向に向けてくれませんか。

4

3 に答える 3

0

データがどのように見えるかはよくわかりませんが、2 つのテーブルがあり、1 つは顧客データ、もう 1 つは顧客と ID に関連付けられた注文データを持つと仮定しています。したがって、次のようなものが機能するはずです。

SELECT DISTINCT customer.id
FROM customers
LEFT JOIN orders
WHERE (Date_Format(orders.date, '%Y-%m') = @m_one AND Date_Format(orders.date, '%Y-%m') = @m_two)
OR (Date_Format(orders.date, '%Y-%m') = @m_one AND Date_Format(orders.date, '%Y-%m') = @m_three)

明らかに、テーブル名を自分のものに置き換えますが、探しているものが得られると思います。

于 2012-04-07T02:08:26.637 に答える
0

条件

WHERE   Date_Format(order_date, '%Y-%m') = @m_two 
  XOR   Date_Format(order_date, '%Y-%m') = @m_three )

あなたが望むことをしません。考えてみれば、この状況では、1 つの order_date 値が 2 つの異なる月にあることは不可能であるため、XOR は OR と同じであることに気付くでしょう。WHERE 句は個々の行ごとに評価されるため、一度に 1 つの order_date 値に対して評価されます。

月 @m_two または @m_three の order_date 値が必要ですが、すべてではありません。両方に表示されるものを除外します。一連の EXISTS および NOT EXISTS 条件を使用することも、このようなことを行うこともできます。(ややハックなので、私よりもよく考えてください。)

SELECT
  c_id, c_name
FROM a_bkorders.bkv_CustOrders
WHERE Date_Format(order_date, '%Y-%m') IN (@m_one,@m_two,@m_three)
GROUP BY c_id, c_name
HAVING -- some order from month @m_one
  MAX(CASE WHEN Date_Format(order_date, '%Y-%m') = @m_one THEN 1 END) = 1
AND -- having orders from exactly two distinct months of the three in question
  COUNT(DISTINCT Date_Format(order_date, '%Y-%m')) = 2;

つまり、これは注文テーブルから、@m_one に少なくとも 1 回、対象の 3 か月のうちちょうど 2 か月に出現する c_id、c_name の値を選択します。

于 2012-04-07T03:27:26.990 に答える
0

私はこのアプローチがより目に見えると思います:

SELECT DISTINCT
    c_id,
    c_name
  FROM a_bkorders.bkv_CustOrders
 WHERE Date_Format(order_date, '%Y-%m') = @m_one
   AND c_id IN (
    SELECT c_id
      FROM a_bkorders.bkv_CustOrders
     WHERE (
        (CASE WHEN Date_Format(order_date, '%Y-%m') = @m_two THEN 1 ELSE 0 END) +
        (CASE WHEN Date_Format(order_date, '%Y-%m') = @m_three THEN 1 ELSE 0 END) = 1) )
;

テストするためのMySQLデータベースがありません。ここでのロジックは非常に単純です。

  • CASE ... END式は1、注文月が指定された月と一致する場合に生成されます。
  • 条件に応じて、月の 1 つだけを使用する必要があるため、合計は になります1
于 2012-04-07T06:31:32.817 に答える