问题是您的查询是不确定的。您正在选择更多作为分组依据的列,其中附加列不是由作为分组依据的列决定的。如果后者为真,那么这将属于 SQL 的 ANSII 标准,因为(在我看来)MySQL 允许该语句运行根本不是 MySQL 的故障。其他 DBMS 则采取相反的方式,因为它们无法确定某些列是否是未包含在 group by 中的其他列的函数,因此它们现在将允许任何包含选择列表中未包含在 group by 中的列的语句。
为了尝试简化问题,请使用以下数据集(表 T)
ID Col1 Col2
1 1 1
2 1 3
运行这个:
SELECT Col1, MAX(Col2) AS MaxCol2, MIN(Col2) AS MinCol2, AVG(Col2) AS AvgCol2
FROM T
GROUP BY Col1
总会回来的
Col1 MaxCol2 MinCol2 AvgCol2
1 3 1 2
但是,如果你抛出ID
融入其中
SELECT ID, Col1, MAX(Col2) AS MaxCol2, MIN(Col2) AS MinCol2, AVG(Col2) AS AvgCol2
FROM T
GROUP BY Col1
无法确定将返回哪个 ID,1 或 2,最可能的结果是
ID Col1 MaxCol2 MinCol2 AvgCol2
1 1 3 1 2
然而,SQL 中没有定义任何内容来表明结果不可能是:
ID Col1 MaxCol2 MinCol2 AvgCol2
2 1 3 1 2
因此,如果上面是结果集,并且您添加了HAVING ID = 1
对于查询,由于 HAVING 子句应用于数据的点,您将不会得到任何结果。如果您要将 ID 添加到GROUP BY
你最终会得到 2 行,据我了解,这不是你想要的,如果你要将它添加到WHERE
您的 MIN、MAX 和 AVG 功能将受到影响。所以需要使用子查询。所以在这个例子中我会使用
SELECT T.ID, T.Col1, MaxCol2, MinCol2, AvgCol2
FROM T
INNER JOIN
( SELECT Col1, MAX(Col2) AS MaxCol2, MIN(Col2) AS MinCol2, AVG(Col2) AS AvgCol2
FROM T
GROUP BY Col1
) T2
ON T.Col1 = T2.Col1
WHERE ID = 1 -- OR ID = 2 DEPENDING ON REQUIREMENTS
为了将其应用到您的情况,数据库引擎已确定将为不在分组依据中的列返回的行是包含 ID = 29 的行。因此,您的 HAVING 子句仅应用于该行,即[电子邮件受保护], and [电子邮件受保护]在应用 HAVING 子句时,in 已从结果中删除。您需要单独执行聚合函数和过滤。
现在我还没有完全理解您的模式,但我希望我已经足够好地解释了非确定性语句的问题,以便您可以对我尝试重写查询进行所需的任何修改
SELECT Avg_Price,
Cnt,
tyd.id_marchand,
tyd.id_product,
catalog.price AS c_price,
tyd.price AS t_price,
tyd.amount AS t_am,
pro_tyd.amount AS p_am,
pro_tyd.price AS p_price,
catalog.img_src,
tyd.step,
tyd.login AS tyd_l
FROM Catalog
INNER JOIN tyd
ON catalog.id_marchand = tyd.id_marchand
AND catalog.id_product = tyd.id_product
INNER JOIN Pro_tyd
ON tyd.id_marchand = pro_tyd.id_marchand
AND tyd.id_product = pro_tyd.id_product
INNER JOIN
( SELECT ID_Marchand, ID_Product, Step, AVG(tyd.price) AS avg_price, COUNT(tyd.id_product) AS cnt
FROM Tyd
WHERE Step = '1'
GROUP BY ID_Marchand, ID_Product, Step
) Agg
ON Agg.id_marchand = pro_tyd.id_marchand
AND Agg.id_product = pro_tyd.id_product
AND Agg.Step = tyd.Step
WHERE tyd.Login = '[email protected]'