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.