Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вывести по 3 товара из каждой категории / 11 сообщений из 11, страница 1 из 1
01.07.2008, 14:57
    #35404333
Berkut
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести по 3 товара из каждой категории
Привет!

Есть таблица товаров. Каждый товар относится к какой-то категории.
Требуется вывести "ленту товаров" из каждой категории. Всего по 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
01.07.2008, 15:00
    #35404345
C#C++
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести по 3 товара из каждой категории
Нельзя ли поподробнее, какие поля в таблице, что есть, и что должно получиться?
С небольшим примером
...
Рейтинг: 0 / 0
01.07.2008, 21:39
    #35405313
Berkut
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести по 3 товара из каждой категории
Упрощенно...

Код: 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
01.07.2008, 22:19
    #35405346
xelaok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести по 3 товара из каждой категории
Код: 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
01.07.2008, 23:27
    #35405377
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести по 3 товара из каждой категории
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
02.07.2008, 10:44
    #35405825
Berkut
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести по 3 товара из каждой категории
Спасибо! Отлично :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
07.10.2009, 17:33
    #36238130
Piratenergy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести по 3 товара из каждой категории
Здравствуйте!

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

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

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

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

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

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

Если будет тяжело на больших таблицах -- замерть и приходите
с експлейнами. Варианты всегда есть, но без конкретности с вашей стороны
обсуждать из не имеет смысла.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
22.06.2019, 19:08
    #39829486
alexbs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести по 3 товара из каждой категории
Код: 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
22.06.2019, 19:48
    #39829488
alexbs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести по 3 товара из каждой категории
А вообще я не могу понять для чего вот эта часть запроса:

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



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


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


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