2015-04-09 3 views
1

Cat и подкатегорию таблицы (cat_tbl):Получить все детали ребенка с отношением родителей в PHP MySQL

id | cat_n | parent_id 
1 | cat | 0 
2 | dog | 0 
3 | tiger | 2 
4 | lion | 0 
5 | abc | 0 
6 | bcd | 3 

Теперь у меня есть таблица продуктов, как показано ниже (prod_tbl):

id | pwght | cid | cpid 
10 | 1.2 | 1 | 0 
11 | 2.4 | 2 | 0 
12 | 3.4 | 2 | 0 
13 | 4.5 | 6 | 3 

и пользовательский финальный стол вес продукта ниже (userprod_tbl):

id | pwght | cid | cpid | prod_id (is above prod_tbl primary id) 
1 | 1.1 | 1 | 0 | 10 
2 | 2.3 | 2 | 0 | 11 
3 | 3.1 | 3 | 2 | 12 
4 | 4.0 | 6 | 3 | 13 

РЕЗУЛЬТАТ: (выход, который я хочу) IS сравнение prod_tbl с userprod_tbl, как показано ниже:

Prod tbl     Userprod tbl 

cat 1.2     cat     1.1 

dog 2.4     dog --  --  2.3 
dog 3.4     dog tiger --  3.1 
dog 4.5     dog tiger bcd  4.0  

Следовательно, в результате 2.4,3.4,4.5 выше, принадлежат Parent ID

Но я получаю, как показано ниже

Prod tbl     Userprod tbl 

cat 1.2     cat     1.1 

dog 2.4     dog --  --  2.3 
dog 3.4     dog tiger --  3.1 

в выше результата я не получаю 4,5 значение как 4,5 имеет 6,3 отношение сверху прод таблицы, но его родительский идентификатор

Ниже мой запрос, который я есть возвращение:

SELECT pt.pwght , upt.pwght ,ct.cat_n,uct.cat_n,umct.cat_n 
FROM prod_tbl AS pt 
LEFT JOIN userprod_tbl AS upt ON (pt.id = upt.prod_id) 
LEFT JOIN cat_tbl AS ct ON pt.packet_id = ct.id 
LEFT JOIN cat_tbl AS uct ON upt.packet_id = uct.id 
LEFT JOIN cat_tbl AS umct ON upt.parent_packet_id = umct.id 

Пожалуйста, дайте мне знать, что не хватает Спасибо

+0

Если я не ошибаюсь, то поправьте меня, как бы вы получите 'dog 4.5', если у вас' 13 | 4.5 | 6 | Это значение в пределах вашего ** prod_tbl **, имеющего ** cid ** ** 6 ** вместо ** 2 ** –

+1

@NarendraSisodia. Приблизительно cid 6 имеет родительский 3, у которого есть родитель 2. Он хочет, чтобы он поднялся лестницу дважды. Не произойдет. – Havenard

+0

@ Хэвенард, да, спасибо за это объяснение –

ответ

0

Это позволит решить вашу проблему я тонкий к.

SELECT pt.pwght AS prod_pwght, upt.pwght AS userprod_pwght , 
     ct.cat_n AS prod_catName,uct.cat_n AS Userprod_catName 
FROM prod_tbl AS pt 
LEFT JOIN userprod_tbl AS upt ON pt.id = upt.prod_id 
LEFT JOIN cat_tbl AS ct ON pt.cid = ct.id 
LEFT JOIN cat_tbl AS uct ON upt.cid = uct.id; 

здесь работает скрипку для вас - http://sqlfiddle.com/#!9/9568a/1

+0

@ nilesh спасибо за запрос ... но, как сказано «Havenard» родительский идентификатор 2 может иметь больше уровней с 6,3, также может быть какой-то другой родительский идентификатор, такой как 1 или другой, может иметь один и тот же уровень ... поэтому в то же время мне нужно иметь группу основного родителя с там дочерним уровнем – user3209031

+0

эй, я сделал то, что сказал ... но не работает :(.. я знаю, ур скрипка его работы, но на моей стороне noo не работает – user3209031

0

Вы не можете перевести рекурсии в SQL. Вы можете сделать ваш запрос более сложным, чтобы охватить эту рекурсию до определенного количества уровней, но не до неопределенного числа, и это очень медленно и совершенно необходимо.

Предлагаю вам ввести cat_tbl в свой скрипт и вычислить эту локацию локации категории, вместо того, чтобы налагать это на MySQL.

Пример (Пожалуйста, обратите внимание, я просто пишу это без тестирования ничего):

$cat_tree = []; 

$res = $mysql->query('SELECT id, cat_n, parent_id FROM cat_tbl'); 
while ($row = $res->fetch_row()) 
    $cat_tree[$row[0]] = [$row[1], $row[2]]; 

function get_tree($cid) 
{ 
    global $cat_tree; 

    $result = [$cat_tree[$cid][1]]; 
    while ($cat_tree[$cid][2]) 
    { 
     $cid = $cat_tree[$cid][2]; 
     $result[] = $cat_tree[$cid][1]; 
    } 
    return array_reverse($result); 
} 

$res = $mysql->query('SELECT pt.id, pt.cid, pt.pwght, ut.cid, ut.pwght FROM prod_tbl pt INNER JOIN userprod_tbl ut ON pt.id = u.prod_id'); 
while ($row = $res->fetch_row()) 
{ 
    $ptree = get_tree($row[1]); 
    $utree = get_tree($row[3]); 
    printf("%s | %f | %s | %s\n", $ptree[0], $row[2], implode(', ', $utree), $row[4]); 
} 

Это должно вывести что-то вроде:

cat | 1.2 | cat | 1.1 
dog | 2.4 | dog | 2.3 
dog | 3.4 | dog, tiger | 3.1 
dog | 4.5 | dog, tiger, bcd | 4.0 
+0

hey havenard, ваш правый родительский идентификатор 2 может иметь больше детей или подчисток .... can пожалуйста, скажите мне в примечании к запросу :) спасибо – user3209031

+0

U означает сказать, что одна кошка и подкачка (например, где cid = 2 ... и т. д.)? ... если это так, то его нет..и нужно показать все записи со сравнением таблицы prod и userprod в одном запросе ... и если я пойму некоторые ошибки, то, пожалуйста, направляйте меня. plss – user3209031

+0

@ user3209031 Я обновил свой ответ с помощью некоторый код. – Havenard