powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вывести по 3 товара из каждой категории
11 сообщений из 11, страница 1 из 1
Вывести по 3 товара из каждой категории
    #35404333
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет!

Есть таблица товаров. Каждый товар относится к какой-то категории.
Требуется вывести "ленту товаров" из каждой категории. Всего по 3 последних товара.

Например:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Mitsubishi
---------

Lancer X 2007       Pajero V Sport  2007        Outlander XL   2006



Nissan
------

Тeana 2008          Note 2006                   Tiida 2008

Количество товаров в одной категории может быть в любом количестве. И кол-во категорий неограничено.

Загвоздка в том, что сгруппировать все одним запросом не получается и LIMIT нельзя использовать в IN().
Ищу оптимальный способ для вывода, чтобы не плодить SQL-запросы.

Заранее спасибо.
...
Рейтинг: 0 / 0
Вывести по 3 товара из каждой категории
    #35404345
C#C++
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нельзя ли поподробнее, какие поля в таблице, что есть, и что должно получиться?
С небольшим примером
...
Рейтинг: 0 / 0
Вывести по 3 товара из каждой категории
    #35405313
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упрощенно...

Код: plaintext
1.
2.
3.
4.
create table t (  
  id int not null auto_increment primary key,
  name varchar( 255 ) not null, 
  category varchar( 255 ))

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
insert into t (name, category) values
('Colt', 'Mitsubishi'), ('Lancer X', 'Mitsubishi'), ('Galant', 'Mitsubishi'), ('Outlander', 'Mitsubishi'), 
('Pajero Sport', 'Mitsubishi'),  ('Grandis', 'Mitsubishi'), ('Outlander XL', 'Mitsubishi'), ('L200', 'Mitsubishi'), 
('Gets', 'Hyundai'), ('Verna', 'Hyundai'), ('Elantra', 'Hyundai'), ('NF', 'Hyundai'), ('Gets', 'Hyundai'),
 ('Tucson', 'Hyundai'), ('Santa Fe', 'Hyundai'), 
('Antara', 'Opel'), ('Astra', 'Opel'), ('Corsa', 'Opel'), ('Meriva', 'Opel'), 
('Antara', 'Opel'), ('Vectra', 'Opel'), ('Zafira', 'Opel')

Код: plaintext
1.
select * from t

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
    id  name          category  
------  ------------  ----------
     1  Colt          Mitsubishi
     2  Lancer X      Mitsubishi
     3  Galant        Mitsubishi
     4  Outlander     Mitsubishi
     5  Pajero Sport  Mitsubishi
     6  Grandis       Mitsubishi
     7  Outlander XL  Mitsubishi
     8  L200          Mitsubishi
     9  Gets          Hyundai   
    10  Verna         Hyundai   
    11  Elantra       Hyundai   
    12  NF            Hyundai   
    13  Gets          Hyundai   
    14  Tucson        Hyundai   
    15  Santa Fe      Hyundai   
    16  Antara        Opel      
    17  Astra         Opel      
    18  Corsa         Opel      
    19  Meriva        Opel      
    20  Antara        Opel      
    21  Vectra        Opel      
    22  Zafira        Opel      

Количество категорий неограниченно. Количество "товаров" в категориях тоже неограниченно.

Нужно вывести по 3 "товара" (не более 3х) из каждой категории:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
     1  Colt          Mitsubishi
     2  Lancer X      Mitsubishi
     3  Galant        Mitsubishi
    10  Verna         Hyundai   
    11  Elantra       Hyundai   
    12  NF            Hyundai  
    18  Corsa         Opel      
    19  Meriva        Opel      
    20  Antara        Opel      
...
Рейтинг: 0 / 0
Вывести по 3 товара из каждой категории
    #35405346
xelaok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select id, name, category from (
  select 
    id,
    name,
    category,
    if(if(@curr_category != category, @curr_category := category, '') != '', @k :=  0 , @k := @k +  1 ) as ind   
  from 
    t, ( select @curr_category := '' ) v 
) t2
where 
  ind <  3 
...
Рейтинг: 0 / 0
Вывести по 3 товара из каждой категории
    #35405377
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xelaok
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select id, name, category from (
  select 
    id,
    name,
    category,
    if(if(@curr_category != category, @curr_category := category, '') != '', @k :=  0 , @k := @k +  1 ) as ind   
  from 
    t, ( select @curr_category := '' ) v 
) t2
where 
  ind <  3 


...ордер бай, не забываем, не забываем (С)
...
Рейтинг: 0 / 0
Вывести по 3 товара из каждой категории
    #35405825
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо! Отлично :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Вывести по 3 товара из каждой категории
    #36238130
Piratenergy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

У меня похожая проблема. По поиску в форуме показалась наиболее подходящая тема.

Нужно вывести по 5 последних книг из категорий книжного каталога.
Дополнительно требуется указать количество книг в каждой категории.
Единственное отличие от приведенного примера ТС выше - наличие таблицы категорий:

Код: plaintext
1.
2.
3.
4.
categories
------------------
category_id
category_name

Приведенное решение xelaok боюсь будет грузить MySQL на больших таблицах.
Может существует другое решение?
Подскажите плиз, кто сталкивался с таким.
...
Рейтинг: 0 / 0
Вывести по 3 товара из каждой категории
    #36238646
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Piratenergy,

нет, лучше способа нет. немного больше подробностей здесь:

http://www.sql.ru/forum/actualthread.aspx?tid=684431

Если будет тяжело на больших таблицах -- замерть и приходите
с експлейнами. Варианты всегда есть, но без конкретности с вашей стороны
обсуждать из не имеет смысла.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Вывести по 3 товара из каждой категории
    #39829486
alexbs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select id, name, category from (
  select 
    id,
    name,
    category,
    if(if(@curr_category != category, @curr_category := category, '') != '', @k := 0, @k := @k + 1) as ind   
  from 
    t, ( select @curr_category := '' ) v 
    ORDER BY category
) t2
where 
  ind < 3



Насчет ORDER BY точно подмечено. Добавил его в запрос.
Он обязательно нужен, т.к. счетчик который хранится в @k будет "обнулятся" когда в записи категория не равна предыдущей категории. То есть если в таблице бренды чередуются (а не отсортированы как в примере ТС) то запрос вернет ноль записей. С ORDER BY `category` будет возвращать ожидаемый результат :)
...
Рейтинг: 0 / 0
Вывести по 3 товара из каждой категории
    #39829488
alexbs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вообще я не могу понять для чего вот эта часть запроса:

Код: sql
1.
, ( select @curr_category := '' ) v



Без него тоже "ок" вроде. Или? )
...
Рейтинг: 0 / 0
Вывести по 3 товара из каждой категории
    #39830088
alexbs, автор
Код: sql
1.
( select @curr_category := '' ) v 


Так производится инициализация переменной curr_category перед началом выборки.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вывести по 3 товара из каждой категории
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]