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