SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 14.07.2013 19:13:29

Борис06
Участник
Зарегистрирован: 14.07.2013
Сообщений: 4

Сложный выбор с GROUP BY

Имеются две таблицы, одна с товарами, вторая с категориями. Есть фильтры, которые применяются к товарам. Нужно сделать вывод:

%НАЗВАНИЕ КАТЕГОРИИ%
и под ним три товара из этой категории, отвечающие заданным критериям

То есть получается

SELECT категории.*, товары.* FROM `товары`, `категории` WHERE %УСЛОВИЯ ДЛЯ ТОВАРОВ% AND товары.`cat_id` = категории.`id` GROUP BY товары.`cat_id`

но так чтобы вывод был не по одному товару, а по три. Ситуация осложняется тем, что категории ещё и нужно отсортировать по среднему значению цены всех содержащихся в них товаров. Ну и плюс сделать постраничный вывод, единицей отсчёта для которой будет не товар, а категория. Как такое сделать, желательно одним запросом (можно с подзапросами)?

Можно, конечно, сделать просто

SELECT категории.* FROM `товары`, `категории` WHERE %УСЛОВИЯ ДЛЯ ТОВАРОВ% AND товары.`cat_id` = категории.`id` GROUP BY товары.`cat_id`

а информацию о трёх товарах подгружать уже отдельными запросами в цикле (хотя нежелательно из-за того что фильтры могут быть довольно сложными с кучей параметров), но как тогда отсортировать категории по средней цене содержащихся в них товаров?

Неактивен

 

#2 14.07.2013 20:29:11

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2423

Re: Сложный выбор с GROUP BY

Прочитайте до конца http://sqlinfo.ru/forum/viewtopic.php?id=1742


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 14.07.2013 20:39:02

Борис06
Участник
Зарегистрирован: 14.07.2013
Сообщений: 4

Re: Сложный выбор с GROUP BY

deadka, спасибо.

Неактивен

 

#4 14.07.2013 20:54:21

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5847

Re: Сложный выбор с GROUP BY

1. Одним запросом лучше не делать (см до конца http://sqlinfo.ru/forum/viewtopic.php?id=1742 )

2. Вы некорректно используете группировку, см FAQ №16 
* в рабочих запросах писать тоже не стоит.

3. Сортировать категории нужно по средней цене:
-)  всех товаров, входящих в категорию
-) только тех, которые удовлетворяют условиям на товары
-) только 3 отображаемых товаров?

4. Какие именно 3 товара из удовлетворяющих условию нужно выводить?

Неактивен

 

#5 14.07.2013 21:42:44

Борис06
Участник
Зарегистрирован: 14.07.2013
Сообщений: 4

Re: Сложный выбор с GROUP BY

vasya
1. Хорошо, не буду;
2. Ok;
3. Всех товаров, правда с условием что товары.`deleted` = 0;
4. По `id` в порядке убывания.

Неактивен

 

#6 14.07.2013 22:10:37

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5847

Re: Сложный выбор с GROUP BY

SELECT c.`НАЗВАНИЕ КАТЕГОРИИ`, sum(t.price)/count(t.id) `средняя цена всех товаров категории с условием что deleted=0` FROM `товары` t JOIN `категории` c ON t.`cat_id` = c.`id` WHERE t.`deleted`=0 GROUP BY t.`cat_id` ORDER BY 2;

Далее в цикле для каждой категории, выбираете 3 товара.
Если товаров, удовлетворяющих условию нет, то категорию не выводите. (Если данная ситуация будет регулярно иметь место, то вначале нужен запрос, который определит нужные категории, а в предыдущий добавите ограничение на категории).

Неактивен

 

#7 14.07.2013 22:25:45

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5847

Re: Сложный выбор с GROUP BY

Кстати, если использовать STRAIGHT_JOIN то порядок сортировки из подзапроса сохраниться?

SELECT c.`название категории` FROM
(SELECT t.cat_id FROM `товары` t WHERE t.`deleted`=0 GROUP BY t.cat_id ORDER BY sum(t.price)/count(t.id)) x STRAIGHT_JOIN `категории` c ON x.`cat_id` = c.`id`

Неактивен

 

#8 14.07.2013 23:04:39

Борис06
Участник
Зарегистрирован: 14.07.2013
Сообщений: 4

Re: Сложный выбор с GROUP BY

Спасибо! А AVG() для цены здесь работать не будет?

UPD: Oops, не заметил что выборка идёт из таблицы с товарами.

Отредактированно Борис06 (14.07.2013 23:06:13)

Неактивен

 

#9 15.07.2013 00:11:35

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5847

Re: Сложный выбор с GROUP BY

Борис06 написал:

Спасибо! А AVG() для цены здесь работать не будет?

Будет, я забыл про эту ф-ию smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson