sql >> データベース >  >> RDS >> Mysql

MySQLエラー:SELECTリストがGROUPBY句にありません

    GROUP BYを使用する場合、グループごとに1つの値がある場合にのみ、選択リストで式を使用できます。そうしないと、あいまいなクエリ結果が得られます。

    あなたの場合、MySQLはs.status グループごとに複数の値を持つ場合があります。たとえば、p.products_idでグループ化しています ただし、s.status 別のテーブルの列ですspecials 、おそらくテーブルproductsと1対多の関係にあります 。したがって、specialsには複数の行がある可能性があります 同じproducts_idで 、ただし、statusの値は異なります 。その場合、statusの値 クエリは使用する必要がありますか?あいまいです。

    データでは、specialsに1行しかないように行を制限する場合があります。 productsの各行 。しかし、MySQLはその仮定を立てることができません。

    MySQL 5.6以前では、自分が何をしているかを知っていると信頼して、このようなあいまいなクエリを記述できます。ただし、MySQL 5.7では、デフォルトでより厳密な適用が可能になっています(これにより、以前のバージョンのように動作するように、より厳密にすることができます)。

    修正は、次のルールに従うことです。選択リストのすべての列は、次の3つのケースのいずれかに該当する必要があります。

    • 列は、COUNT()、SUM()、MIN、MAX()、AVERAGE()、またはGROUP_CONCAT()などの集計関数内にあります。
    • この列は、GROUP BYで指定された列の1つです。 条項。
    • この列は、GROUP BYで指定された列に機能的に依存しています。 条項。

    詳細については、次の優れたブログをご覧ください:GROUPBYの神話を暴く

    コメントを再確認してください。テーブル定義を投稿していないため、推測することしかできません。

    products_descriptionだと思います およびmanufacturers productsに機能的に依存しています 、したがって、選択リストにそのままリストしてもかまいません。しかし、この仮定は正しくない可能性があります。あなたのスキーマはわかりません。

    とにかく、s.statusに関するエラー 集計関数を使用して解決する必要があります。 MAX()を使用しています 例として。

    SELECT p.*,
    pd.*,
    m.*,
    MAX(IF(s.status, s.specials_new_products_price, NULL)) 
      AS specials_new_products_price,
    MAX(IF(s.status, s.specials_new_products_price, p.products_price)) 
      AS final_price
    FROM products p 
    LEFT OUTER JOIN specials s ON p.products_id = s.products_id  
    INNER JOIN manufacturers m ON p.manufacturers_id = m.manufacturers_id
    INNER JOIN products_description pd ON p.products_id = pd.products_id
    INNER JOIN products_to_categories p2c ON p.products_id = p2c.products_id
    INNER JOIN categories c ON p2c.categories_id = c.categories_id
    WHERE p.products_view = 1  
    AND p.products_status = 1
    AND p.products_archive = 0
    AND c.virtual_categories = 0
    AND pd.language_id = 1
    GROUP BY p.products_id;
    

    また、あなたの参加を適切な方法で書き直しました。カンマスタイルの結合は避ける必要があります。



    1. MySqlに16進値を挿入します

    2. MySQLでコンバージョン率を計算する方法は?

    3. MySQLとPostgreSQLのデッドロックを理解する

    4. MySQLのフィールドをインクリメントすることはアトミックですか?