2014-01-23 4 views
0

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

таблица

идентификатор, ParentId, имя.

parentid is 0 для родителей и = id для детей.

Задача состоит в том, чтобы показать отсортированные по алфавиту родители и всех детей под родителями, также отсортированные по алфавиту. Все элементы должны иметь имена и соответствующие им идентификаторы. Структура такова:

AAA 
BBB 
-> eee of BBB 
-> ooo of BBB 
-> zzz of BBB 
CCC 
DDD 
-> mmm of DDD 
-> nnn of DDD 
EEE 
FFF 
... 

Это мой глупый код, однако он работает. MySQL сортирует все элементы по алфавиту, а PHP просто перебирает уже отсортированные имена, выбирая и показывая дочерние элементы для каждого родителя. Мне не нравится этот дополнительный цикл, который запускается для каждого родительского элемента, может быть, кто-то может предложить лучший способ с точки зрения производительности?

$sqlquer="SELECT id, parentid, name FROM mytable ORDER BY name"; 
    $ath = mysql_query($sqlquer); 

    while ($row = mysql_fetch_array($ath)) { 
    if ($row[parentid]==0) $parents[]=$row; 
     else $children[]=$row; 
} 

foreach($parents as $par) 
{ 
echo("$par[name]($par[id])<br>"); 
    foreach($children as $ch) 
    { if ($ch[parentid]==$par[id]) 
       echo("->$ch[name]($ch[id])<br>"); 
    } 
} 
+0

Вот такая же ситуация, как и вы. Вы можете изменить решение и использовать его как свой выход. Http://stackoverflow.com/questions/21306338/php-mysql-multidimensional-array-dropdown-menu/21308976#21308976 –

+0

Это действительно медленный ??? – Steve

+0

Я не понял, что вы подразумеваете под медленным? –

ответ

0
select 
    if (b.parentid is null, a.name, concat('->', a.name, ' of ', b.name) 
    fieldname 
from 
    table a 
left 
    join table b 
on 
    a.parentid = b.id 
order by 
    if (b.parentid is null, a.name, b.name), 
    a.name 

Жалко не формат и неформально ответ, но теперь я с мобильного телефона. Надеюсь, что это сработает, я сделал это без тестирования, для любой проблемы вы можете связаться со мной. С помощью этого решения вы можете делать то, что хотите, только в одном запросе и должны возвращать полученные результаты.

+0

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

+0

У этого есть странное поведение сортировки, когда у родителя есть дети.У меня есть что-то вроде 'а-родительским б-родительским -> а-подпозиция-оф-с -> б-supitem-оф-с с родителем -> d-подпозиция-оф-с - > е-подпозиция-оф-с ** вместо ** а-родительским б-родитель с родителем -> а-подпозиция-оф-с -> б-supitem-оф-с - > d-subitem-of-c -> e-subitem-of-c' Кроме того, я не знаю, как получить другие значения из raw, например id в моем примере, для записи 'c-parent (c) id) -> a-subitem-of-c (id) ... ' – TOL

+0

Привет, я протестировал его прямо сейчас со следующей таблицей:' CREATE TABLE mytable ( id int (11) unsigned NOT NULL AUTO_INCREMENT, parentid int (11) unsigned NOT NULL, имя char (50) NOT NULL DEFAULT '', ПЕРВИЧНЫЙ КЛЮЧ (d) ) ENGINE = InnoDB AUTO_INCREMENT = 12 DEFAULT CHARSET = utf8; 'и следующие данные' INSERT INTO mytable (id , parentid, name) VALUES (1, 0, 'AAA'), (2, 0, 'BBB'), (3, 0, 'CCC'), (4, 0, 'DDD'), (5, 0, 'EEE'), (6, 0, 'FFF'), (7, 2, 'eee'), (8, 2, 'ooo'), (9, 2, 'zzz'), (10, 4, 'mmm'), (11, 4, 'nnn'); '. Здесь вывод: [link] (http://www.tiikoni.com/tis/view/?id=24592c1). Это нормально? – matteospampani

Смежные вопросы