Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Kesalahan MySQL:daftar SELECT tidak ada dalam klausa GROUP BY

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Algoritma untuk menghasilkan angka acak

  2. NameError:nama '_mysql' tidak ditentukan setelah perubahan pengaturan ke mysql

  3. Mysql Select Rows Di mana dua kolom tidak memiliki nilai yang sama

  4. Laravel Eloquent vs pembuat kueri - Mengapa menggunakan fasih untuk menurunkan kinerja

  5. MySQL:Rincian cepat dari jenis gabungan