Запросить только указанное количество элементов из родительских / дочерних категорий - PullRequest
0 голосов
/ 15 мая 2010

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

<code>download_categories

category_id (int) primary key
title (var_char)
parent_id (int)
загрузок id (int) первичный ключ title (var_char) category_id (int) дата (дата)

Мне нужно запросить каждый файл в основной категории, которая, скажем, имеет 100 элементов и 5 дочерних категорий и выплевывает только последние 10 добавленных. Сейчас у меня есть функции, которые просто складывают все файлы, чтобы я мог получить счетчик по категории, но я не могу изменить код, чтобы отображать только определенное количество элементов на основе даты.

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

Код помещает все категории загрузок в массив, а затем перебирает каждую из них, запрашивая загрузки с этим category_id.

Мой лучший выбор - поместить результаты в массив, а затем отсортировать их оттуда?

function list_cat_files($parent, $start) {

    global $menu_array;

    if($start == 1) {

        unset($GLOBALS["total"]);

        $query = mysql_query("SELECT * FROM download_categories");

        while ( $row = mysql_fetch_assoc($query) ) {

            $menu_array[$row['category_id']] =
              array(
                'name'        => $row['title'],
                'parent'      => $row['parent_id'],
                'category_id' => $row['category_id']);

        }
    }

    foreach($menu_array as $key => $value) {

        global $total;

        if ($value['parent'] == $parent) {

            $category_id = $value['category_id'];

            $query1 = mysql_query("SELECT lid AS id, title, date, category_id FROM downloads WHERE category_id='$category_id'");

            while($item = mysql_fetch_array($query1)) {

                $total .= "--- ($item[lid]) : $item[title] <BR><BR>";
            }

            list_cat_files($key, 0);
        }
    }
    return $total;
}

Ответы [ 2 ]

0 голосов
/ 15 мая 2010

Хотелось бы что-нибудь подобное? Предполагая, что $ category - это массив идентификаторов категорий, которые вы хотите.

$query = FALSE;


foreach ($categories as $category){
    $query .= $query ? ' UNION ': '';

    $query .= "SELECT * from `downloads`
        WHERE category_id=$category order by date limit 10\n";

}

// run query here

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

0 голосов
/ 15 мая 2010
select * from downloads where category_id=X order by date limit 10

Повторите для каждой категории. Если вы не хотите реализовать вложенный набор / модифицированный обход дерева предзаказа (MPTT): http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

...