MySQL / PHP: Как вывести результаты в группы, но ограничить количество запросов к БД - PullRequest
1 голос
/ 19 декабря 2009

У меня есть база данных следующим образом:

---------------------------------------------------------------
|       module_name      |     category    |       content    |
---------------------------------------------------------------
|       module1          |     category1   |       content    |
|       module2          |     category1   |       content    |
|       module3          |     category2   |       content    |
|       module4          |     category3   |       content    |
|       module5          |     category2   |       content    |
---------------------------------------------------------------

Я хочу иметь возможность создавать группы результатов, но не могу найти самый быстрый и эффективный способ сделать это без вложенных запросов MySQL. Результат должен выглядеть следующим образом (стиль игнорируется):

---------------------------------------------------------------
|       module1         |     category1    |       content    |
|       module2         |     category1    |       content    |
---------------------------------------------------------------

---------------------------------------------------------------
|       module3         |     category2    |       content    |
|       module5         |     category2    |       content    |
---------------------------------------------------------------

---------------------------------------------------------------
|       module4         |     category3    |       content    |
---------------------------------------------------------------

Мой код выглядит так:

$query  = 'SELECT'
        . ' DISTINCT'
        . ' category AS name'
        . ' FROM #__table'
        . ' WHERE enabled = 1';
$db->setQuery($query);
$categories = $db->loadObjectList();
foreach ($categories as $category) {
$query  = 'SELECT'
    . ' module_name'
    . ' FROM #__table'
        . ' WHERE enabled = 1 AND category = \'' . $category->name . '\''
        . ' ORDER BY id';                       
    $db->setQuery($query);
    $results = $db->loadObjectList();
foreach ($results as $result) {
        echo $result->module_name;
    }
}

Это вложенный запрос, который работает, но есть ли лучший способ сделать это?

Ответы [ 4 ]

3 голосов
/ 19 декабря 2009
  1. Сортировка набора записей по категории столбец (затем по имени_модуля).
  2. Переберите свой набор записей, сохраняя трек категории, в которой вы находитесь ($ Current_category).
  3. Когда категория строки не соответствует $ current_category, вы начинаете новая группировка.

Более конкретно, адаптируя ваш код:

$query  = 'SELECT'
        . ' module_name, category'
        . ' FROM #__table'
        . ' WHERE enabled = 1 '
        . ' ORDER BY category, id';                                               
$db->setQuery($query);
$results = $db->loadObjectList();

$current_category = null;
foreach ($results as $result) 
{
    if ($current_category != $result->category)
    {
        // whatever you do to separate the category listings
        //  if you don't do it before the first, check ($current_category != null)

        $current_category = $result->category
    }
    echo $result->module_name;
}
0 голосов
/ 19 декабря 2009

Просто используйте массив. Если ваш набор данных не слишком большой.

foreach($results as $result)
    //assuming $result is an associative array
    $sorted_results[$result['category']][] = $result;
}

//now you can do fun stuff like
foreach($sorted_results as $category => $category_result_list) {
    //do something meaningful
}

Редактировать: только что увидел ваш пример кода

0 голосов
/ 19 декабря 2009

Мне кажется, что вы выкладываете свою таблицу данных в 3 таблицы, а не в 1 таблицу с 3 столбцами и несколькими строками. В этом сценарии:

Присоединяйтесь к своим таблицам и группируйте результаты по категориям.

0 голосов
/ 19 декабря 2009

Один из подходов - запросить базу данных для всех строк, отсортированных по категориям, а затем выполнить группирование в отдельные таблицы в PHP. Вы можете либо перебирать строки, отслеживая изменения в категории и выводить их непосредственно в HTML, либо создавать структуру вложенных массивов, отражающих структуру групп и строк в каждой группе, а затем использовать ее для визуализации вашего HTML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...