Saat Anda menggunakan GROUP BY, Anda dapat menggunakan ekspresi dalam daftar pilihan Anda hanya jika mereka memiliki satu nilai per grup. Jika tidak, Anda mendapatkan hasil kueri yang ambigu.
Dalam kasus Anda, MySQL percaya bahwa s.status
mungkin memiliki beberapa nilai per grup. Misalnya, Anda mengelompokkan menurut p.products_id
tapi s.status
adalah kolom di tabel lain specials
, mungkin dalam hubungan satu-ke-banyak dengan tabel products
. Jadi mungkin ada beberapa baris di specials
dengan products_id
yang sama , tetapi nilai yang berbeda untuk status
. Jika demikian, yang mana nilai untuk status
haruskah kueri digunakan? Ini ambigu.
Dalam data Anda, Anda mungkin membatasi baris sehingga Anda hanya memiliki satu baris di specials
untuk setiap baris di products
. Tapi MySQL tidak bisa membuat asumsi itu.
MySQL 5.6 dan sebelumnya memungkinkan Anda menulis kueri yang ambigu, percaya bahwa Anda tahu apa yang Anda lakukan. Tetapi MySQL 5.7 memungkinkan penegakan yang lebih ketat secara default (ini dapat dibuat kurang ketat untuk berperilaku seperti versi sebelumnya).
Cara mengatasinya adalah dengan mengikuti aturan ini:Setiap kolom dalam daftar pilihan Anda harus termasuk dalam salah satu dari tiga kasus:
- Kolom berada di dalam fungsi agregat seperti COUNT(), SUM(), MIN, MAX(), AVERAGE(), atau GROUP_CONCAT().
- Kolom adalah salah satu kolom yang disebutkan dalam
GROUP BY
klausa. - Kolom secara fungsional bergantung pada kolom yang disebutkan dalam
GROUP BY
klausa.
Untuk penjelasan lebih lanjut, baca blog yang luar biasa ini:Debunking GROUP BY mitos
Re komentar Anda, saya hanya bisa menebak karena Anda belum memposting definisi tabel Anda.
Saya menduga bahwa products_description
dan manufacturers
secara fungsional bergantung pada products
, jadi tidak apa-apa untuk mencantumkannya seperti di daftar pilih. Tapi asumsi ini mungkin tidak benar, saya tidak tahu skema Anda.
Bagaimanapun, kesalahan tentang s.status
harus diselesaikan dengan menggunakan fungsi agregat. Saya menggunakan MAX()
sebagai contoh.
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;
Saya juga menulis ulang gabungan Anda dengan cara yang benar. Gabungan gaya koma harus dihindari.