@freshik312

Как найти в базе похожие записи?

Добрый день !
Есть база:
id |    name   | pid | width
1  |    test   |  0  | 0
2  |  test (2) |  0  | 0
3  |   othre   |  0  | 0
4  |  test (6) |  0  | 0
5  | other (3) |  0  | 0


Нужно сделать перебор по строкам и сделать что то на подобии поиска дочерних элементов.
Логика, ищем все записи, где pid = 0 и width = 0, потом из полученного результата проходимся по всем записям.. Нужно найти все элементы, которые похожи по названию (в примере базы есть строки у которых общее название test, отличие только то, что в скобках), если у найденного элемента нету скобок - родительский элемент, если есть скобки - дочерний. исходя из этого нужно всем дочерним элементам установить id родительского в pid, а так же цифру из скобок поместить в width

Т.е. нужно получить:
id |    name   | pid | width
1  |    test   |  0  | 0
2  |  test (2) |  1  | 2
3  |   othre   |  0  | 0
4  |  test (6) |  1  | 6
5  | other (3) |  3  | 3


Подскажите как я могу это реализовать при помощи php и sql ? было бы невероятно хорошо, если выйдет на уровне, только, sql
  • Вопрос задан
  • 114 просмотров
Решения вопроса 1
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
разовая, когда из импорта приходят данные,
Тогда достаточно банально,
селект где pid = 0 и width = 0,
затем уже в пыхе перебор строк,
експлодим name пробелом,
выбираем все строки где name теперь массив длинной 1(это будут корни) в отдельный массив
и ключами в этом массиве делаем name.
Еще один раз перебираем массив строк с проверкой или массив длинной более 1 в name,
после чего из name[1] вытаскиваем чистую цифру(убираем скобки), записываем в width,
из name[0] получаем ключ к массиву корней, из которого достаем id, и кладем в pid.
Всё, строчки упдэйтнуть в базу.

Вполне возможно где-то можно улучшить алгоритм, но "в лоб" - это самый очевидный вариант.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
А смысл? У вас `pid` указывает на `id` родителя.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы