Выбрать все записи с таблицы 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 записей с каждой категории.
Вот объяснение каждого элемента кода:
set @n=3, @i=0, @p=0;
- Здесь три переменные устанавливаются в начальные значения. Переменная@n
устанавливается в 3, что, вероятно, означает, что из каждой категории выбираются 3 записи. Переменные@i
и@p
устанавливаются в 0. Переменная@i
используется для подсчета количества выбранных записей, а переменная@p
используется для отслеживания текущей категории.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
, точно понять, что делает этот код, невозможно.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д