我想通过将每一行与表中的所有其他行进行比较来更新列,但我无法弄清楚如何区分正在更新的行中的列名与正在搜索的行。
这是一个简化的例子......
人:
+--------+-----+----------------+
| 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。
答案 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;
您无法更新计算字段,但可以轻松查询。