sql >> Base de Datos >  >> RDS >> Mysql

Error de MySQL:la lista SELECT no está en la cláusula GROUP BY

Cuando usa GROUP BY, puede usar expresiones en su lista de selección solo si tienen un solo valor por grupo. De lo contrario, obtendrá resultados de consulta ambiguos.

En su caso, MySQL cree que s.status puede tener varios valores por grupo. Por ejemplo, está agrupando por p.products_id pero s.status es una columna en otra tabla specials , tal vez en una relación de uno a muchos con la tabla products . Por lo tanto, puede haber varias filas en specials con el mismo products_id , pero diferentes valores para status . Si ese es el caso, ¿qué valor para status debe usar la consulta? Es ambiguo.

En sus datos, es posible que limite las filas de modo que solo tenga una fila en specials para cada fila en products . Pero MySQL no puede hacer esa suposición.

MySQL 5.6 y versiones anteriores le permiten escribir consultas tan ambiguas, confiando en que sabe lo que está haciendo. Pero MySQL 5.7 permite una aplicación más estricta de forma predeterminada (esto puede hacerse menos estricto para comportarse como versiones anteriores).

La solución es seguir esta regla:cada columna en su lista de selección debe caer en uno de los tres casos:

  • La columna está dentro de una función agregada como COUNT(), SUM(), MIN, MAX(), AVERAGE() o GROUP_CONCAT().
  • La columna es una de las columnas nombradas en el GROUP BY cláusula.
  • La columna depende funcionalmente de las columnas nombradas en GROUP BY cláusula.

Para obtener más explicaciones, lea este excelente blog:Desmitificando GRUPO POR mitos

Con respecto a su comentario, solo puedo adivinar porque no ha publicado las definiciones de su tabla.

Supongo que products_description y manufacturers dependen funcionalmente de products , por lo que está bien enumerarlos tal como están en la lista de selección. Pero esta suposición puede no ser correcta, no conozco tu esquema.

De todos modos, el error sobre s.status debe resolverse utilizando una función agregada. estoy usando MAX() como ejemplo.

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;

También reescribí tus uniones de la manera adecuada. Deben evitarse las uniones de estilo coma.