有人已经帮助我进行了此查询,但我进行了修改,但遇到了一个问题:
SELECT AVG(tyd.price) AS avg_price, COUNT(tyd.id_product) AS 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 AND tyd.step = "1" INNER JOIN pro_tyd ON tyd.id_marchand = pro_tyd.id_marchand AND tyd.id_product = pro_tyd.id_product GROUP BY catalog.id_product, catalog.id_marchand HAVING tyd.login = "user1@tyd.fr"
并且仅tyd.login = "user3@tyd.fr"在较低的ID时有效。不适用于user1或user2 …我只是想不通为什么…!如果我按tyd.login分组,它也可以工作,但在这种情况下,AVG和COUNT函数只能在一行上工作…
tyd.login = "user3@tyd.fr"
这是表格:
id id_marchand id_product login price amount delay step time 29 1 1 user3@tyd.fr 344 1 0 1 1343297500 120 1 1 user1@tyd.fr 54 1 0 1 1343297504 109 1 1 user10@tyd.fr 34 1 0 1 1343298598
当HAVING tyd.login = "user3@tyd.fr"它完美地工作时。当user1或user2我有0行。
HAVING tyd.login = "user3@tyd.fr"
感谢您的帮助
问题是您的查询是不确定的。您正在选择要分组的其他列,而其他列不是由分组的列确定的。如果后者是正确的,那么这将落入SQL的ANSII标准中,因为(在我看来)这并不是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加入其中
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行,据我了解,这不是您想要的,如果将ID添加到,则WHEREMIN,MAX和AVG函数将受到影响。因此,您需要使用子查询。因此,在此示例中,我将使用
HAVING ID = 1
GROUP BY
WHERE
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
为了将这种情况应用到您的情况中,数据库引擎确定将针对不在group by中的列返回的行是包含ID = 29的行。因此,您的HAVING子句仅应用于该行,具有在应用HAVING子句时,已经从结果中删除了user1@tyd.fr和user10@tyd.fr。您需要分别执行聚合功能和过滤。
现在,我还没有完全了解您的模式,但是我希望我已经很好地解释了非确定性语句的问题,以便您可以对我重写查询的尝试做出必要的修改。
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 = 'user1@tyd.fr'