mysql: группируйте результаты, ограничивайте их и объединяйте в другие таблицы одним запросом - PullRequest
1 голос
/ 30 марта 2012

У меня есть онлайн-приложение, для которого мне нужна своего рода панель инструментов (для использования пробела).

Для операции используются три таблицы:

1.) categories: id, name
2.) entries: id, name, description, category_id, created, modified
3.) entryimages: id, filename, description, entry_id

вкл.на панели инструментов я хочу показать 4-5 записей (с миниатюрными изображениями, поэтому мне требуются объединения в таблицу entryimages и таблицу категорий) для каждой категории.

Я прочитал некоторые статьи (и темы на них), напримервот этот: http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

Но я все еще не понимаю, я пытался сначала извлечь все категории и для каждой категории построить запрос и с помощью «all union» прикрепить их к одной, ноэто не работает.Последняя версия кода, которую я использовал:

foreach($categories as $id => $name)
{
    $query .= "SELECT   `entry`.`id`,
            `entry`.`name`,
            `entry`.`description`,
            `entry`.`category_id`,
            `entry`.`created`,
            `entry`.`modified`,
            `entryimages`.`filename`,
            `entryimages`.`description`
            FROM `entries` as `entry` LEFT JOIN `entryimages` ON `entryimages`.`entry_id` = `entry`.`id`
WHERE `entry`.`category_id` = $id ";

            if($i < count($groups))
            {
                $query .= 'UNION ALL ';
            }

            $i++;
        }

        $result = mysql_query($query);

Кто-нибудь знает, как лучше всего выполнить эту операцию?

Спасибо 1000

Ответы [ 2 ]

1 голос
/ 30 марта 2012

На панели инструментов, если вы хотите показать три записи, ваш способ неправильный. Если я правильно понимаю, весь запрос будет выглядеть примерно так:

"SELECT `entry`.`id`,
        `entry`.`name`,
        `entry`.`description`,
        `entry`.`category_id`,
        `entry`.`created`,
        `entry`.`modified`,
        `entryimages`.`filename`,
        `entryimages`.`description`
    FROM `entries` as `entry` 
    INNER JOIN categories 
        ON (entry.category_id = categories.id)
    LEFT JOIN (SELECT * FROM `entryimages` WHERE `entry_id` = `entry`.`id` LIMIT 1) AS `entryimages`
        ON `entryimages`.`entry_id` =`entry`.`id`    
    ORDER BY `entry`.`created` DESC LIMIT 5";
1 голос
/ 30 марта 2012

Ваш код выглядит нормально для меня, вам нужно просто добавить предложение LIMIT, чтобы вы получили только пять из них, и предложение ORDER BY, чтобы получить самое последнее

$query .= "SELECT   `entry`.`id`,
        `entry`.`name`,
        `entry`.`description`,
        `entry`.`category_id`,
        `entry`.`created`,
        `entry`.`modified`,
        `entryimages`.`filename`,
        `entryimages`.`description`
        FROM `entries` as `entry` LEFT JOIN `entryimages` ON `entryimages`.`entry_id` =         `entry`.`id`    
WHERE `entry`.`category_id` = $id   ORDER BY `entry`.`created` DESC LIMIT 5";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...