使用同一个表中的查询计数值更新行列

时间:2014-10-13 16:49:35

标签: mysql sql-update

我想知道是否有人可以提供帮助。

我有一个产品表,在表中有一个名为master_colours的列。

我在表中有3列名为stock_id,master和color,主列告诉它要链接到哪个stock_id ...

stock_id, master, colour
12345, '', ''
aaa, '12345', 'red'
bbb, '12345', 'blue'
ccc, '12345', 'green'

在master_colours列中,我希望将其更新为主产品将具有多少颜色的值,因此在上面的示例中它将为3.

到目前为止,我有以下代码返回错误#1242 - 子查询返回超过1行。

UPDATE products AS main
SET main.master_colours = (SELECT master.stock_id FROM (
SELECT p.stock_id, COUNT(DISTINCT(m.colour))
FROM products AS p, products AS m
WHERE m.master = p.stock_id AND m.colour != ''
GROUP BY p.stock_id) AS master)

我明白为什么它这样做是因为我按照stock_id分组但是如果我不这样做则会计算表格中的所有颜色而不是链接到该股票ID的颜色。

对我来说合乎逻辑的是这样做......

UPDATE products AS main
SET main.master_colours = (SELECT master.stock_id FROM (
SELECT p.stock_id, COUNT(DISTINCT(m.colour))
FROM products AS p, products AS m
WHERE m.master = p.stock_id AND m.colour != '' AND p.stock_id = main.stock_id
GROUP BY p.stock_id) AS master)

但显然这不起作用,因为main.stock_id在子查询之外。

任何人都可以指出我正确的方向吗?

由于

1 个答案:

答案 0 :(得分:1)

你在找这样的东西吗?

UPDATE products p JOIN
(
  SELECT master, COUNT(*) total
    FROM products
   GROUP BY master
) q ON p.stock_id = q.master
   SET p.master_colours = total;

假设您只有1级深层次

结果:

| STOCK_ID | MASTER | COLOUR | MASTER_COLOURS |
|----------|--------|--------|----------------|
|    12345 |        |        |              3 |
|      aaa |  12345 |    red |         (null) |
|      bbb |  12345 |   blue |         (null) |
|      ccc |  12345 |  green |         (null) |

这是 SQLFiddle 演示