Нужен совет по реализация алгоритма

12
R34-zevs
На сайте с 15.07.2006
Offline
239
1280

Доброго времени суток, уважаемые. Занимаемся вопрос реализации алгоритма кластеризации категорий. Идея такова:

Есть 'категория', её id = 10,

В неё входит 'подкатегория' id = 1012,

в неё входит 'подподкатегория' id = 101218

Думаю идея ясна, что для вывода полного уровня вложенности (графа) для подподкатегории, нужно "потрошить" её id и тогда уже вытаскивать её подкатегорию и категорию.

Вот теперь вопрос по поводу реалзиации алгоритма. Первое что пришло в голову:


$cid = '101218';

if(strlen($cid) == 6)
{
//вытаскиваем из бд название этой подподкатегории
$cid = substr($cid, 0, -2);
}
if(strlen($cid) == 4)
{
//вытаскиваем из бд название этой подкатегории
$cid = substr($cid, 0, -2);
}
if(strlen($cid) == 2)
{
//вытаскиваем из бд название этой категории

}

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

Минусы данного решения - 3 запроса MySQL. Готов рассмотреть идеи со сложным запросом и манипулированием ф-ций LEFT, RIGHT и MID

Хотелось бы услышать ваше мнение. Кто какие еще видит решения?

Агентство недвижимости Фабрика Жилья (http://xn--80aacvicll3bzbzgqb.xn--p1ai/)
C
На сайте с 04.02.2005
Offline
277
#1

$cid = '101218';

такой конструкцией вы сами себя поставите в тупик

$cid = '10_12_18';

Так вы, возможно увидите свет в туннеле.

R34-zevs
На сайте с 15.07.2006
Offline
239
#2
Chukcha:
$cid = '101218';
такой конструкцией вы сами себя поставите в тупик

$cid = '10_12_18';
Так вы, возможно увидите свет в туннеле.

cid - это id категорий, он хранится в бд под типом int(). Нерационально будет хранение в том виде, в каком предлагаете вы и с ним придется "изобретать много велосипедов".

101218 - хранение данных в таком виде дает возможность для большого диапазона подкатегорий и подподкатегорий.

Braindbrigada
На сайте с 10.01.2010
Offline
84
#3

Думаю помогут подзапросы

C
На сайте с 04.02.2005
Offline
277
#4

Вот вам в помощь

http://club.shelek.ru/viewart.php?id=307

cid - это id категорий,

т.е. вы не рассматривает возможности категории с id=1

или id = 100

R34-zevs
На сайте с 15.07.2006
Offline
239
#5
Chukcha:
Вот вам в помощь
http://club.shelek.ru/viewart.php?id=307


cid - это id категорий,

т.е. вы не рассматривает возможности категории с id=1
или id = 100

Все правильно. Диапазон категорий будет формально от 11 до 99, диапазон подкатегорий будет от

1111-9999, подкатегорий 111111-999999.

siv1987
На сайте с 02.04.2009
Offline
427
#6
R34-zevs:
Минусы данного решения - 3 запроса MySQL.

Почему три? Я тут вижу только один запрос.

R34-zevs
На сайте с 15.07.2006
Offline
239
#7

siv1987, Ну смотрите сами. Если cid подходит по первому условию, то из бд вытаскивается подподкатегория и у cid отрезается последние 2 символа, таким образом он подходит по второму условию, где cid==4, для cid==2 аналогично

C
На сайте с 04.02.2005
Offline
277
#8

Подзапросы возникают на момент поиска родителей, поиска дочерних элементов, т.е на момент прохождения по дереву.

Но никак не на момент прямого доступа к элементу.

siv1987
На сайте с 02.04.2009
Offline
427
#9
R34-zevs:
siv1987, Ну смотрите сами. Если cid подходит по первому условию, то из бд вытаскивается подподкатегория и у cid отрезается последние 2 символа, таким образом он подходит по второму условию, где cid==4, для cid==2 аналогично

У вас есть $cid = '101218', что мешает его разобрать на составные ид и выбрать категории одним запросом - id IN ( implode(',', $cids) )?

R34-zevs
На сайте с 15.07.2006
Offline
239
#10

Понял, в вашей идеи что-то есть. Тогда у нас должен быть запрос такого вида

можно сделать так:

$cid = '101218';
$step = strlen($cid) /2;
$cids = '';

for($i = 1; $i <= $step; $i++)
{
$cids .= $cid.",";
$cid = substr($cid, 0, -2);
}
$cids = substr($cids, 0, -1);

echo $cids;

Но вот нельзя делить сам $cid=101218 на средствами MySQL, чтоб получался вот такой вот смысл id IN ( '101218', '1012', '10' ), но без велосипеда на php

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий