Выбрать все записи с таблицы ah_gallery но не более чем 10 с каждой категории - MySQL

Узнай цену своей работы

Формулировка задачи:

привет всем!

помогите пожалуйста исправить запрос..

я не нуб в sql но й любителем назватся немогу .. вот попался чуть более сложный запрос и все.. ступор .. инфу по тому как построить запрос нашел здесь.. *****

задача:

выбрать все записи с таблицы ah_gallery но не более чем 10 с каждой категории

проблема:

имеющийся запрос выбирает записи по очереди.. а нужно чтобы с каждой категории максимум 10 было *****

запрос:

set @n=1, @i=0, @p=0;
select `ah_categories`.`id`, `ah_categories`.`title` from `ah_gallery` LEFT JOIN `gallery_category` ON `ah_gallery`.`id` = `gallery_category`.`gallery_id` LEFT JOIN `ah_categories` ON `gallery_category`.`category_id` = `ah_categories`.`id` where if(@p=`ah_categories`.`id`, @i:=@i+1,(@i:=0) or (@p:=`ah_categories`.`id`)) and @i<@n ORDER BY `ah_gallery`.`id` DESC;
*****

таблица ah_gallery:

CREATE TABLE IF NOT EXISTS `ah_gallery` (
  `id` mediumint(9) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `bullet` text NOT NULL,
  `description` text NOT NULL,
  `price` float NOT NULL DEFAULT '0',
  `price_muted` float DEFAULT NULL,
  `created` int(11) NOT NULL,
  `updated` int(11) NOT NULL,
  `status` tinyint(4) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

таблица ah_categories:

CREATE TABLE IF NOT EXISTS `ah_categories` (
  `id` smallint(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `pseudo` varchar(50) NOT NULL,
  `status` tinyint(4) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

таблица gallery_category (соеденяющая):

CREATE TABLE IF NOT EXISTS `gallery_category` (
  `gallery_id` mediumint(9) NOT NULL,
  `category_id` smallint(9) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
*****

п.с. связь между таблицами ah_gallery и ah_categories многие ко многим

Решение задачи: «Выбрать все записи с таблицы ah_gallery но не более чем 10 с каждой категории»

textual
Листинг программы
set @n=3, @i=0, @p=0;
 
select * from (select *, if (@p=x, @i:=@i+1,(@i:=0) or (@p:=x)) and (@i<@n) AS f from g t1 join p t2 on t1.x=t2.y) xx where f;

Объяснение кода листинга программы

Представленный SQL-код является немного неправильным, и его сложно понять без дополнительной информации. Однако, основываясь на предоставленной информации, можно предположить, что код пытается выполнить следующую задачу: выбрать все записи из таблицы ah_gallery, но не более чем 10 записей с каждой категории. Вот объяснение каждого элемента кода:

  1. set @n=3, @i=0, @p=0; - Здесь три переменные устанавливаются в начальные значения. Переменная @n устанавливается в 3, что, вероятно, означает, что из каждой категории выбираются 3 записи. Переменные @i и @p устанавливаются в 0. Переменная @i используется для подсчета количества выбранных записей, а переменная @p используется для отслеживания текущей категории.
  2. select * from (select *, if (@p=x, @i:=@i+1,(@i:=0) or (@p:=x)) and (@i<@n) AS f from g t1 join p t2 on t1.x=t2.y) xx where f; - Этот код использует подзапрос и включает в себя несколько элементов.
    • if (@p=x, @i:=@i+1,(@i:=0) or (@p:=x)) - это условие, которое проверяет, является ли текущая запись записью из той же категории, что и предыдущая. Если это так, то переменная @i увеличивается на 1. Если нет, то переменная @i сбрасывается в 0, а переменная @p устанавливается в значение x, которое, вероятно, представляет собой значение столбца, содержащего категорию записи.
    • AS f - это псевдоним для вычисленного выражения, которое возвращает true, если запись должна быть включена в результат, и false в противном случае.
    • where f - это условие, которое включает в результат только те записи, для которых вычисленное выражение равно true. В итоге, этот код должен выбирать из каждой категории не более 3 записей. Однако, из-за неправильного синтаксиса и отсутствия информации о структуре таблицы ah_gallery и связи с таблицей p, точно понять, что делает этот код, невозможно.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.8 из 5
Похожие ответы