有人已经帮我解决了这个问题,但我做了一个改编,我遇到了一个问题:
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"
它只适用于较低ID的tyd.login = "user3@tyd.fr"
。不能用于user1或user2 ......我只是无法理解为什么......!如果我按tyd.login分组也可以工作,但在这种情况下,AVG和COUNT功能只能在一行上工作......
这是表格:
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行时。
感谢您的帮助
第一主题:Sql, get the average on a group while escaping the where condition
答案 0 :(得分:3)
问题是您的查询是非确定性的。您正在选择要分组的更多列,其中附加列不是由您要分组的列确定的。如果后者是真的,那么这将属于SQL的ANSII标准,因为它不是(在我看来)MySQL的失败,它允许语句运行。其他DBMS采用了相反的方式,因为它们无法确定某些列是否是组中未包含的其他列的函数,它们现在将允许任何语句中包含选择列表中未包含在组中的列。
要尝试简化问题,请使用以下数据集(表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子句应用于数据的点,您将得不到任何结果。如果您要向GROUP BY
添加ID,您最终会得到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
要将此应用于您的情况,数据库引擎已经确定将为不在group by中的列返回的行是包含ID = 29的行。因此,您的HAVING子句仅应用于此行,在应用HAVING子句时,已经从结果中删除了user1@tyd.fr和user10@tyd.fr 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 = 'user1@tyd.fr'
答案 1 :(得分:0)
我只想添加此查询:
SELECT * FROM tyd WHERE step = "1"
GROUP BY tyd.id_product, tyd.id_marchand
HAVING tyd.login = "user1@tyd.fr"
有同样的问题。在tyd.login =“user3”时工作,但在其他用户询问时不工作......