- ベストアンサー
2つのSQL文で結果に差違が発生する
- 2つのSQL文を実行させた場合、結果に差違が発生しますか?
- SQL文Aでは抽出条件が正しく実行されず、全レコードの総価格が計算されます。
- SQL文Bでは抽出条件が正しく実行され、目的の値が返されます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
AとBとでは、SQLの目的が異なるように見えます。 Bは2015/11に発売されたアイテムの定価をカテゴリーごとに合算したもの、 Bは2015/11に発売されたアイテムの売上をカテゴリーごとに合算したものに見えます。 例えば、あるアイテムに対してorderテーブル内に5つのレコードがあった場合、Aではそのアイテムに対する価格が5回加算されますが、Bでは1回しか加算されません。 従って、AとBでは結果が異なると思います。
その他の回答 (3)
- yassan4
- ベストアンサー率23% (3/13)
>以下の2つのSQL文を実行させた場合、「total_price」の値に違いは発生しますか? ⇒発生します。特にorderテーブルにレコードがあるかどうかで。 >こちらで上記と同じようなSQL文を実行すると、Bで出てほしい値がAでは出てこないのです。 ⇒意味がよくわからないのですが、、出てほしい値はBで出ているんですかね?その上でAには出てこないという意味でしょうか。 そういう意味ならorderテーブルにINNER JOINしてる分Aのほうが抽出条件が厳しいので やっぱり出てこない値のitems.idの値がorderテーブルに含まれていないんじゃないかと推測します。 >Aの場合は「WHERE DATE_FORMAT(`items`.`date`, '%Y%m') = 201511」が抽出条件として実行されていないような感じです。 >すべてのレコードの「SUM(`items`.`price` * `items`.`max_num`) AS `total_price`」が計算されています。 >Bだけで実行すればちゃんとほしい値が返ってきます。 ⇒値が違う理由は上記だと思うので ここは無視しします。 何か間違っていますか? ⇒2つのSQL文が間違っているかどうかは、そのSQLで何が出したいのか 言葉にして頂けるとはっきり答えれるのですが、そうでないと 何とも言えません。 回答が中途半端になり、申し訳ないですが 進捗があることを切に願います。
- m-take0220
- ベストアンサー率61% (480/785)
> Aの場合は「WHERE DATE_FORMAT(`items`.`date`, '%Y%m') = 201511」が抽出条件として実行されていないような感じです。 その予想が正しいかどうかは簡単に検証できます。 AのWHERE句を削除した形で、同じ結果が得られるか確認すればいいのです。 私の予想では、異なる結果が得られるのではないかと思います。 両方のSQLを、結合条件と抽出条件はそのままにSELECT * とし、GROUP BYを削除して、抽出されているレコードを比べてみましょう。違いがあるはずです。 私の予想では、orderテーブルのitem_idが一意でないのではないかと思います。
単純に A で order テーブルを内部結合 ( INNER JOIN ) しているからではないですかね? これを外部結合 ( LEFT JOIN ) に変えたらどうなりますか?
お礼
遅くなって申し訳ありません。 よく見ると確かにSQLの意味が違いますね。 すみませんでした。