繁体   English   中英

MySQL:平均OF子查询(在FROM / GROUP BY中不存在)

[英]MySQL: Average OF Subquerys (NOT in the FROM/GROUP BY)

我想显示数据库中产品组的平均价格。 因此,我想返回该产品组中所有产品随时间的平均价格。

首先,我想知道该组的价格变化了多少。 该查询成功返回所有日期,并带有该查询...

SELECT DISTINCT(DATE(gbp.prdate)) as dte
FROM sku AS s
  INNER JOIN mt_price gbp ON s.id = gbp.
WHERE (gbp.prdate < NOW() - INTERVAL ? DAY) AND (s.grp = ?)`

然后我在php中使用foreach生成以下查询...

$i = 1;
$qry = "SELECT s.id AS sid, s.sku, s.title AS s_title,";
foreach ($dates as $date) {
  $qry .= "(SELECT price FROM price WHERE price.sid = s.id AND prdate <= DATE(?) ORDER BY prdate LIMIT 1) AS ?, ";
  $datearr[] = $date;
}
$qry = substr($qry, 0, -2) . " ";
$qry .= "FROM sku AS s
  WHERE (s.grp = ?)
  GROUP BY s.id
  ORDER BY s.id";
$results = $db->prepare($qry);
foreach($datearr as $darr) {
  $results->bindParam($i++,$darr->dte,PDO::PARAM_STR);
  $results->bindParam($i++,$darr->dte,PDO::PARAM_STR);
}

上面的一个例子给了我这个查询...

SELECT s.id AS sid, s.rid, s.sku, s.title AS s_title,
  (SELECT price FROM price WHERE price.sid = s.id AND prdate <= DATE('2015-01-08') ORDER BY prdate LIMIT 1) AS '2015-01-08',
  (SELECT price FROM price WHERE price.sid = s.id AND prdate <= DATE('2015-02-12') ORDER BY prdate LIMIT 1) AS '2015-02-12',
  (SELECT price FROM price WHERE price.sid = s.id AND prdate <= DATE('2015-01-26') ORDER BY prdate LIMIT 1) AS '2015-01-26',
  (SELECT price FROM price WHERE price.sid = s.id AND prdate <= DATE('2015-02-08') ORDER BY prdate LIMIT 1) AS '2015-02-08',
  (SELECT price FROM price WHERE price.sid = s.id AND prdate <= DATE('2015-01-30') ORDER BY prdate LIMIT 1) AS '2015-01-30',
  (SELECT price FROM price WHERE price.sid = s.id AND prdate <= DATE('2015-02-02') ORDER BY prdate LIMIT 1) AS '2015-02-02'

从sku AS的位置(s.cat ='TLPT01')GROUP BY s.id ORDER BY s.id

当我按上述方式运行此查询时,我得到了期望的结果,即每个SKU只有一个价格(降至LIMIT ),并且是正确的价格。 然后,随着DATE更改,它将正确显示SKU的价格。 是的,我!

因此,我想要获得所有这些结果的平均值。 如果我在s.id使用AVG ,则可以获得SKU的平均值,这显然不是意味着任何结果的结果。 我想要返回的所有SKU的平均价格(因此, GROUP BY应该只给我提供一行信息)。 当我将GROUP BY放在子查询之前时,我只是得到一个错误。

您没有在编码您所说的内容; 每个日期的平均值 在子查询(简化)上使用平均查询:

select date, avg(avg_price) from (
    select group_id, date, avg(price) avg_price
    from mytable
    group by group_id, date
) x
group by date

内部查询将为每个group_ id和日期生成一个平均值,而外部查询仅按日期对这些group_id / date值进行平均。

尝试按以下方式进行子查询(从价格WHERE price.sid = s.id和prdate <= DATE(?)GROUP BY price.sid中选择AVG(price))

我发现将子查询移到LEFT JOIN解决方案中。 然后,我可以对这些JOIN返回的价格进行AVG处理。 我仍然不知道为什么我不能只AVG查询进行AVG ,但是这种方法(虽然不是超级快)可以工作。

SELECT s.cat, s.id AS sid, s.rid, s.sku, s.title AS s_title, AVG(pr1.price)
FROM sku AS s
  LEFT JOIN (SELECT sid, price, prdate FROM price WHERE prdate <= DATE('2014-12-21') ) AS pr1 ON s.id = pr1.sid
  ... <more from foreach, add more AVG on top line> ...
WHERE (s.cat = 'TLPT01')
GROUP BY cat

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM