0

私は本当に頭が壊れており、助けを願っています;-)

このMySQLクエリがあります:

SELECT
    sum(ot.value) AS total_value,
    avg(ot.value) AS avg,
    count(ot.value) AS count
FROM
    orders_total ot,
    orders o
WHERE
    ot.orders_id = o.orders_id
AND ot.class = 'ot_total'
AND o.customers_name != 'Test Test'
AND o.date_purchased >= '2014-02-01T00:00:00'
AND o.date_purchased < '2014-03-01T00:00:00'

しかし、orders_idがordersテーブルとorders_totalテーブルの両方にある場合にのみ、値を選択したいと思います。

したがって、orders_idがorders_totalテーブルにない場合、クエリに含めたくありません..

以下のように、左右の結合を試みましたが、運がありません;-(

SELECT
    sum(ot.value) AS total_value,
    avg(ot.value) AS avg,
    count(ot.value) AS count
FROM
    orders o
RIGHT JOIN orders_total ot ON (ot.orders_id = o.orders_id)
WHERE
    ot.orders_id = o.orders_id
AND ot.class = 'ot_total'
AND o.customers_name != 'Test Test'
AND o.date_purchased >= '2014-02-01T00:00:00'
AND o.date_purchased < '2014-03-01T00:00:00'

私は何を間違っていますか?

前もって感謝します!バス

4

2 に答える 2

0

正直なところ、これは問題ではないと思いますjoin。間違った結果が出ていると思います。結合の問題だと思います。あなたのデータは結果を倍増させている可能性があります。おそらくあなたは本当に欲しい:

SELECT sum(ot.value) AS total_value,
       avg(ot.value) AS avg,
       count(ot.value) AS count
FROM orders_total ot
WHERE ot.class = 'ot_total' AND
      EXISTS (select 1
              from orders o
              where ot.orders_id = o.orders_id and 
                    o.customers_name <> 'Test Test' and
                    o.date_purchased >= '2014-02-01T00:00:00' and
                    o.date_purchased < '2014-03-01T00:00:00'
            );

これは、テーブルselectの列のみを使用しているためです。orders_totalこれにより、結合によって値が乗算されるリスクが発生します。

于 2014-06-28T13:15:49.873 に答える
0

これを試してみてください..内部結合は、あなたが望むのと同じことを行います.

 SELECT
        sum(ot.value) AS total_value,
        avg(ot.value) AS avg,
        count(ot.value) AS count
    FROM
        orders o
    INNER JOIN orders_total ot ON (ot.orders_id = o.orders_id)
    WHERE
    AND ot.class = 'ot_total'
    AND o.customers_name != 'Test Test'
    AND o.date_purchased >= '2014-02-01T00:00:00'
    AND o.date_purchased < '2014-03-01T00:00:00'
于 2014-06-28T11:38:59.363 に答える