【问题标题】:Use UPDATE to populate column of 2nd table with AVG data使用 UPDATE 用 AVG 数据填充第二个表的列
【发布时间】:2017-07-27 20:26:25
【问题描述】:

这是我的两张表sold_itemscategories。 :

已售商品:

分类:

sold_items 使用来自categories 表的id_Categories 作为外键。

我正在使用此命令尝试填充基于“idCategories”的项目的average_price - 所以是1或2。 我正在使用此命令计算 idCategories 分类为 2 的商品的平均价格:

UPDATE categories SET average_price = (SELECT AVG(price) FROM sold_items) WHERE idCategories='2'

此命令成功执行,没有错误,但不是计算 idCategories = 2 的两个项目的平均价格,而是计算所有产品价格的平均值并将 638.00 的值插入到 categories 表中,因此它看起来像这样:

正确计算的值为 999.50(即 1000+999/2)。我的 SQL 命令有什么问题?

提前致谢

【问题讨论】:

  • 您需要在子查询中指定哪里 idCategories = 2 (SELECT AVG(price) FROM sold_items WHERE idCategories = 2)

标签: mysql sql database foreign-keys mysql-workbench


【解决方案1】:

我会推荐一个相关的子查询:

UPDATE categories c
    SET average_price = (SELECT AVG(si.price)
                         FROM sold_items si
                         WHERE si.iDCategories = c.idCategories
                        )
    WHERE idCategories = 2;

这使得一次更新多个类别甚至所有类别变得更加容易。

注意:如果您的 id 是数字(您的似乎是),请不要使用单引号进行比较。

【讨论】:

  • 不错!我也打算建议这个选项。
  • HI Gordon,您提到我可以一次更新所有类别,我会更改什么来执行此操作?干杯编辑-你也能解释一下csi位吗?我以前从未见过这些
  • @bms9nmh 。 . .这些是表别名。当查询引用多个表时,它们通常被推荐并且非常强烈推荐。要更新所有类别,您只需删除 where 子句。
【解决方案2】:

您还需要在子查询中指定 idCategories = 2 的位置:

UPDATE categories 
SET average_price = (SELECT AVG(price) FROM sold_items WHERE idCategories='2') 
WHERE idCategories=2

【讨论】:

    【解决方案3】:

    试试这个:

    CREATE TABLE sold_items (
        idsold_items INT,
        item_number VARCHAR(7),
        title VARCHAR(14),
        URL VARCHAR(3),
        price INT,
        idCategories INT
    )
    
    CREATE TABLE categories (
        idCategories INT,
        model VARCHAR(7),
        averageprice FLOAT(10,2),
        keyword VARCHAR(1)
    )
    
    INSERT INTO sold_items
    VALUES ('1', '14545', 'Equitek CAD', '...', '99', '1'),
           ('2', '454545', 'Equitek', '...', '454', '1'),
           ('3', '456645', 'Samsung', NULL, '999', '2'),
           ('4', '5456464', 'Samsung Galaxy', '', '1000', '2')
    
    INSERT INTO categories
    VALUES ('1', 'Equitek', NULL, ''),
           ('2', 'Samsung', NULL, NULL)
    
    UPDATE categories
    SET averageprice = CalculatedAverage.averagePrice
    FROM categories
    JOIN (
        SELECT
            idCategories,
            [averagePrice] = AVG(price)
        FROM sold_items
        GROUP BY idCategories
    ) CalculatedAverage ON categories.idCategories = CalculatedAverage.idCategories
    

    结果:

    idCategories     model    averageprice    keyword
    1                Equitek  276.00
    2                Samsung  999.00          NULL
    

    【讨论】:

    • CREATE TABLE 也存在于 MySQL 中。你能告诉我哪一点语法不正确吗?
    猜你喜欢
    • 2014-02-04
    • 1970-01-01
    • 2020-05-06
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 2011-01-10
    • 1970-01-01
    相关资源
    最近更新 更多