mySql - 通过比较同一个表中的行进行更新

时间:2010-08-26 10:37:54

标签: mysql compare

我想通过将每一行与表中的所有其他行进行比较来更新列,但我无法弄清楚如何区分正在更新的行中的列名与正在搜索的行。

这是一个简化的例子......

人:
    +--------+-----+----------------+
    | name | age | nameClosestAge |
    +--------+-----+----------------+
    | alice | 20 | |
    | bob | 30 | |
    | clive | 22 | |
    | duncan | 24 | |
    +--------+-----+----------------+

要填写'nameClosestAge'列,其中包含与每个人年龄最接近的人的姓名,您可以这样做...

create temporary table peopleTemp like people;
insert into peopleTemp select * from people;
update people set nameClosestAge = 
(select name from peopleTemp where people.name != peopleTemp.name 
order by abs(people.age - peopleTemp.age) asc limit 1);

产生这个....
+--------+-----+----------------+
| name | age | nameClosestAge |
+--------+-----+----------------+
| alice | 20 | clive |
| bob | 30 | duncan |
| clive | 22 | alice |
| duncan | 25 | clive |
+--------+-----+----------------+

当然有一种方法可以在不创建重复表的情况下执行此操作。 我正在寻找最有效的方法,因为我有一个非常大的表,它需要很长时间才能更新。 我正在使用mySql和PHP。

1 个答案:

答案 0 :(得分:1)

您可以只使用一个子查询而不使用临时表来执行此操作。

SELECT name, age, (
  SELECT name
  FROM people
  WHERE name != ppl.name
  ORDER BY ABS( people.age - ppl.age ) 
  LIMIT 1
  ) AS nameClosestAge
FROM people AS ppl;

检查并工作:)

编辑:如果您希望能够使用calc'ed行,您可以使用视图;

CREATE VIEW people_close AS 
  SELECT name, age, (
    SELECT name
    FROM people
    WHERE name != ppl.name
    ORDER BY ABS( people.age - ppl.age ) 
    LIMIT 1
  ) AS nameClosestAge
  FROM people AS ppl;

您无法更新计算字段,但可以轻松查询。