4

我有一张产品表和一张产品评论表。产品表具有父产品和子产品。父产品应该得到子产品的所有评论。我做了:

DROP TABLE IF EXISTS products;
CREATE TABLE products (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `parent` int(10) unsigned DEFAULT NULL,
    `review` decimal(3,2) DEFAULT NULL,
    PRIMARY KEY(id)
);

DROP TABLE IF EXISTS reviews;
CREATE TABLE reviews (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `product` int(10) unsigned NOT NULL,
    `review` decimal(3,2) DEFAULT NULL,
    PRIMARY KEY(id) 
);

INSERT INTO products SET id=1, parent=null;
INSERT INTO products SET id=2, parent=1;
INSERT INTO products SET id=3, parent=1;

INSERT INTO reviews SET product=2, review=5;
INSERT INTO reviews SET product=3, review=5;
INSERT INTO reviews SET product=3, review=4;

INSERT INTO products SET id=4, parent=null;
INSERT INTO products SET id=5, parent=4;

INSERT INTO reviews SET product=5, review=4;
INSERT INTO reviews SET product=5, review=2;

UPDATE products
SET products.review=
(SELECT SUM(reviews.review)/COUNT(reviews.review) FROM reviews 
LEFT JOIN products p ON p.parent = products.id
)
WHERE products.parent IS NULL;

但是我很惊讶我收到了一个错误:

错误 1054 (42S22):“on 子句”中的未知列“products.id”

有关如何正确执行此操作的任何建议?这个想法是产品 1 应该得到 14/3 = 4.66 的评论,产品 4 应该得到 6/2 = 3 的评论。

4

3 回答 3

3

产品在子查询中不可见。请改用以下语法:

UPDATE products pp
LEFT JOIN (
  SELECT pc.parent, SUM(r.review)/COUNT(r.review) as 'rev'
  FROM reviews r
    LEFT JOIN products pc on r.product = pc.id
  GROUP BY pc.parent
) pcc ON pcc.parent = pp.id  
SET pp.review=pcc.rev
WHERE pp.parent IS NULL;
于 2018-08-15T10:58:58.637 回答
0

由于您已声明pproducts表的别名,因此您需要在整个查询中使用它。因此,在您的LEFT JOIN子句中只需使用p.parent而不是products.parent.

UPDATE products
SET products.review=
(SELECT SUM(reviews.review)/COUNT(reviews.review) FROM reviews 
LEFT JOIN products p ON p.parent = p.id
)
WHERE products.parent IS NULL;
于 2018-08-15T10:44:10.837 回答
0

从本质上讲,您似乎正在寻找这个值:

SELECT SUM(r.review)/(SELECT COUNT(*) FROM products) n FROM reviews r;
+----------+
| n        |
+----------+
| 4.666667 |
+----------+

所以,像...

UPDATE products x 
  JOIN (SELECT SUM(r.review)/(SELECT COUNT(*) FROM products) n FROM reviews r) y
   SET x.review = y.n
 WHERE x.review IS NULL;
于 2018-08-15T11:04:23.153 回答