Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > убрать повторения по определенной колонке базы


Автор: denis7777777 8.11.2012, 12:43
Всем привет.
есть sql запрос

Код

select dle_pages.id as page_id, dle_pages.cid as page_cid, dle_pages.page_name as page_name, dle_pages.page_alt_name as page_alt_name, 

(select dle_category_pages.name from dle_category_pages where dle_category_pages.id=page_cid) as cat_name,
(select dle_category_pages.alt_name from dle_category_pages where dle_category_pages.id=page_cid) as cat_alt_name

from dle_pages where dle_pages.cid in (SELECT dle_category_pages.id
FROM `dle_category_pages` where parentid='15') order by dle_pages.cid


результат выполнения запроса: 

Код

page_id    page_cid    page_name    page_alt_name    cat_name    cat_alt_name 
33    16    вопрос 1    vopros1    Общие вопросы    general
34    16    Вопрос 3    vopros3    Общие вопросы    general
42    17    вопрос2    vopros2    Технические вопросы    technical

исполняющий код: 
Код

$db->query( "select dle_pages.id as page_id, dle_pages.cid as page_cid, dle_pages.page_name as page_name, dle_pages.page_alt_name as page_alt_name, 

(select dle_category_pages.name from dle_category_pages where dle_category_pages.id=page_cid) as cat_name,
(select dle_category_pages.alt_name from dle_category_pages where dle_category_pages.id=page_cid) as cat_alt_name

from dle_pages where dle_pages.cid in (SELECT dle_category_pages.id
FROM `dle_category_pages` where parentid='15') order by dle_pages.cid ");

        
        while ( $row = $db->get_row() ) {

$cat_name = $row['cat_name'];

echo "<b>".$cat_name."</b><br /><br />";
echo $row['page_name']."<br />";
        }


результат выполнения: 
http://s2.ipicture.ru/

подскажите пожалуйста как сделать что бы текст "Общие вопросы" выводился 1 раз?  smile 
вывести его вверху, а дальше пошли страницы из этой категории уже.
и так со всеми категориями, например "Технические вопросы"

Автор: Fortop 8.11.2012, 13:07
Как вариант запоминать предыдущее значение $cat_name
И если оно равно текущему, то не выводить его

Код

print ($cat_name == $old_cat_name ? '':$cat_name);


как-то так

Автор: denis7777777 8.11.2012, 13:14
Fortop, а $old_cat_name это что такое, как оно должно быть сделано?

Автор: Aliance 8.11.2012, 15:00
Я вижу здесь 2 адекватных решения:
1) изменить логику запроса, возможно сделать два. Сперва выбираем категории, потом для каждой категории внутренности. Либо группировка.
2) Группировка на стороне сервера. Что-то типа:
Код

$categories = array();
while ($row = $db->get_row()) {
    if ( ! array_key_exists($row['page_cid'], $categories)) {
        $categories[$row['page_cid']] = array(
            'title' => $row['cat_name'],
            'alt'   => $row['cat_alt_name'],
            'pages' => array()
        );
    }
    $categories[$row['page_cid']]['pages'][$row['page_id']] = $row['page_name'];
}
foreach ($categories as $categoryId => $category) {
    echo '<ul>';
    printf('Категория: %s [%d]', $category['title'], $categoryId);
    foreach ($category['pages'] as $pageId => $page) {
        printf('<li>Страница: %s [%d]</li>', $page, $pageId);
    }
    echo '</ul>';
}


И пользуйтесь правильной кнопкой код, для sql языка есть отдельная кнопка.

Автор: denis7777777 8.11.2012, 17:48
Aliance, спасибо огромное, то что нужно. smile 
на счет sql кода понял, не заметил выпадающий список.  smile 

Автор: denis7777777 8.11.2012, 20:53
Aliance, подскажите пожалуйста еще вот какой момент. 
сижу пытаюсь прописать ссылку на страницу, не получается.
пробовал так: 
Код

printf("<li><a href=\"".$row['page_alt_name']."\">%s</a> </li>", $page, $pageId);


как сделать что бы вместо # 
Код

printf("<li><a href=\"#\">%s</a> </li>", $page, $pageId);

был вывод 
Код

$row['page_alt_name'];

заранее благодарен.

Автор: Fortop 8.11.2012, 23:48
Цитата(denis7777777 @  8.11.2012,  13:14 Найти цитируемый пост)
Fortop, а $old_cat_name это что такое, как оно должно быть сделано? 

Я же написал.
Цитата(Fortop @  8.11.2012,  13:07 Найти цитируемый пост)
Как вариант запоминать предыдущее значение $cat_name


После того как  вы уже вывели текущий $cat_name запоминайте его значение в $old_cat_name внутри цикла.

Автор: Aliance 9.11.2012, 10:23
Код

printf('<li><a href="%s">%s</a></li>', $row['page_alt_name'], $page);


Мануал тут: php.net/sprintf

Автор: denis7777777 9.11.2012, 22:58
Цитата(Fortop @  8.11.2012,  23:48 Найти цитируемый пост)
После того как  вы уже вывели текущий $cat_name запоминайте его значение в $old_cat_name внутри цикла.

все получилось. спасибо.  smile 

Цитата(Aliance @  9.11.2012,  10:23 Найти цитируемый пост)
Мануал тут: php.net/sprintf

уже читал, но что то не вкурил сначала что и как   smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)