MYSQL - 根据连接的另外两个表更新一个表中的计数

时间:2015-09-23 15:37:25

标签: mysql

我有3张相关的表格。成人,儿童和AC。成人包含一个INT专栏,可以计算高中毕业生的数量。孩子们有一个年级高中毕业的专栏。 AC将adult.id链接到children.id。

CREATE TABLE adults (
  id INT,
  name VARCHAR(10),
  seniors INT DEFAULT 0
) ;

INSERT INTO adults (id, name) VALUES
(1, 'adam'),
(2, 'bob');

CREATE TABLE children (
  id INT,
  name VARCHAR(10),
  grad VARCHAR(4)
) ;

INSERT INTO children (id, name, grad) VALUES
(1, 'sally', '2016'),
(2, 'johnny', '2017'),
(3, 'eric', '2016'),
(4, 'billy', '2016'),
(5, 'rachel', '2016');

CREATE TABLE pc (
  id INT,
  a_id INT,
  c_id INT
) ;

INSERT INTO pc (id, a_id, c_id) VALUES
(1, 1, 1),
(2, 1, 2),
(3, 1, 3),
(4, 2, 3),
(5, 2, 2);

SQLFiddle:http://sqlfiddle.com/#!2/89281e

因此,我希望将成年人的年龄更新为2016年的数量'他们与之相关的孩子。成年人#1将是" 2" (莎莉和埃里克),成人#2" 1" (ERIC)。

实际数据将在25,000多名儿童中进行,这些儿童最多可与40,000多名父母匹配,并在#34; pc"超过3,000,000行的表 - 所以寻找效率。我开始沿着这条路走下去但a)由于明显的原因它没有工作,b)我怀疑它会有效......

UPDATE adults a SET
    seniors = (
       SELECT p.a_id, count(*)
       FROM pc p
       INNER JOIN children c ON c.id = p.c_id
       WHERE c.grad = '2016'
       GROUP BY p.c_id)
   WHERE p.a_id = a.id;

我认为必须有一种更好的方式来实现这种连接,但似乎无法绕过它。

1 个答案:

答案 0 :(得分:1)

您应该寻找此更新声明:

UPDATE adults a
        JOIN
    (SELECT 
        p.a_id, COUNT(*) childrencount
    FROM
        pc p
    INNER JOIN children c ON c.id = p.c_id
    WHERE
        c.grad = '2016'
    GROUP BY p.a_id) c ON (a.id = c.a_id)
SET 
    seniors = c.childrencount;