2016-11-18 7 views
5

タスク:最も購入した製品をショップごとに表示します。
3テーブル:ショップ、商品、お支払い。 1店舗に販売されている商品に同数の商品がある場合は、どちらの商品を選ぶかは関係ありません。問題別のMySQLグループ:sql_mode = only_full_group_byとの互換性がありません

私はこのクエリにgroup by句に問題がある:MySQLの5.6では

SELECT shop_id, product_id, 
(
    SELECT COUNT(*) 
    FROM payment 
    WHERE product.product_id = payment.product_id 
) sold 
FROM product 
GROUP BY shop_id 
HAVING MAX(sold) 

またはこのクエリが働くだろう下げます。 これが正しい結果になります。

shop_id | product_id | sold 
1   1   3 
2   3   1 
3   5   1 

しかし、選択中のproduct_idが非集計データが含まれているため、5.7に、私は、= ONLY_FULL_GROUP_BY sql_modeのと互換性を取得しています。

完全なエラーメッセージ:

Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'product.product_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by 

だから私はそうなどによりグループ内のproduct_idを追加することだろうと思ったソリューション:

SELECT shop_id, product_id, 
(
    SELECT COUNT(*) 
    FROM payment 
    WHERE product.product_id = payment.product_id 
) sold 
FROM product 
GROUP BY shop_id, product_id 
HAVING MAX(sold) 

エラーを修正するが、それは間違った結果を返し、それはもはや店の列を独特なものにすることはない。私はこれを取得しています:

shop_id | product_id | sold 
1   1   3 
1   2   4 
2   3   1 
2   4   1 
3   5   1 

SQLfiddleは、MySQL 5.6を使用していますが、みんなの生活を楽にしますhttp://sqlfiddle.com/#!9/ca12bf9/6

+0

ここで支払いテーブルを使用しているのはなぜですか – e4c5

+0

@ e4c5 1支払いには1商品があり、1商品には0..N支払いがあります。支払いテーブルの各行は販売されている商品を表しています。そのため、特定の商品が何回販売されたかを知るために、その上にCOUNTを出しています。 – Amodar

+0

rawデータからshop_id 2の製品3と4をそれぞれ1つ販売しているため、元の結果が正しいかどうかわかりません。どのようにしてネクタイを処理しますか?それは考慮すべきものです。 – CGritton

答えて

3

あなたの要件は驚くほど複雑です。 MySQLのGROUP BYへの非標準的な拡張から有用な結果が得られたのは、全く偶発的なです。その拡張子に基づく結果は、話すロバとしてはまったく類似していません。それはひどくうまく動作していない驚くべきことではありません、それはまったく効果があります。

あなたがしなければならないことは次のとおりです。

(1)製品とショップごとの売上をまとめます。 (http://sqlfiddle.com/#!9/ca12bf9/12/0

    select product.product_id, product.shop_id, count(*) sale_count 
        from product 
        join payment on product.product_id = payment.product_id 
        group by product.product_id, product.shop_id 

(2)、(1)(http://sqlfiddle.com/#!9/ca12bf9/13/0

 SELECT MAX(sale_count) max_sale_count, shop_id 
     FROM (
        select product.product_id, product.shop_id, count(*) sale_count 
        from product 
        join payment on product.product_id = payment.product_id 
        group by product.product_id, product.shop_id 
       ) findmax 
     GROUP BY shop_id 

(3)参加を要約することにより、各店舗で最も売れている製品の販売単位数を見つける(1 )〜(2)を使用して、各店舗で最も売れた商品の識別情報を取得します。(http://sqlfiddle.com/#!9/ca12bf9/11/0

SELECT a.product_id, a.shop_id, b.max_sale_count 
    FROM (
      select product.product_id, product.shop_id, count(*) sale_count 
       from product 
       join payment on product.product_id = payment.product_id 
      group by product.product_id, product.shop_id  
     ) a 
    JOIN (
     SELECT MAX(sale_count) max_sale_count, shop_id 
       FROM (
         select product.product_id, product.shop_id, count(*) sale_count 
         from product 
         join payment on product.product_id = payment.product_id 
         group by product.product_id, product.shop_id 
        ) findmax 
       GROUP BY shop_id 
     ) b ON a.shop_id = b.shop_id AND a.sale_count = b.max_sale_count 

あなたが提供したデータはネクタイです。だから、2つの異なる商品があなたのお店の1つにベストセラーとして現れます。

構造化構造化クエリ言語に置き換えたのは、この種のクエリです。

1

どちらかがセットsql_mode ='' in my.ini

により、ブランク にsql_modeのを設定することができたり、ANY_VALUE(product_id)

を使用することができます

グループで非集約列を使用している間に、結果がどうなるかを決して保証しないでください。

https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_any-value

更新1http://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

+0

ありがとうございます、ANY_VALUEは機能します。しかし、確かにANY_VALUEなしでこの問題を解決する方法やSQLモードを変更する方法が必要ですか? mysqlの以前のバージョンの – Amodar

+0

では、mysqlは暗黙的に5.7で導入された関数と同じ動作を行います。 – developerCK

関連する問題