mySql - обновление путем сравнения строк в одной таблице - PullRequest
0 голосов
/ 26 августа 2010

Я хочу обновить столбец, сравнивая каждую строку со всеми другими строками в таблице, но не могу понять, как отличить имена столбцов в обновляемой строке от строк, по которым производится поиск.

Вот упрощенный пример ...

люди:
+--------+-----+----------------+
| 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 Ответ

1 голос
/ 26 августа 2010

Вы можете выполнить это только одним подзапросом и без временной таблицы.

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;

Проверено и работает:)

РЕДАКТИРОВАТЬ: Если вы хотите иметь возможность работать свычисленная строка, вы можете использовать представление;

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;

Вы не можете обновить вычисляемое поле, но можете легко запросить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...