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

12
f0x
На сайте с 20.09.2006
Offline
116
f0x
1100

есть 2 таблицы groups и catalog

groups

+-----+----------+

| id | title |

+-----+----------+

| 334 | Название |

| 333 | Название |

| 332 | Название |

| 331 | Название |

catalog

+-----+-----------+-------+-------+

| id | type | title | price |

+-----+-----------+-------+-------+

| 334 | Название | товар | 100 |

| 333 | Название | товар | 34 |

| 332 | Название | товар | 50 |

| 331 | Название | товар | 0 |

| 330 | Название | товар | 43 |

| 329 | Название | товар | 0 |

| 328 | Название | товар | 0 |

| 327 | Название | товар | 400 |

Первая таблица это группы товаров, вторая сгруппированные товары.

Необходимо вывести все товарные группы и к каждой группе прикрепить цену. Эта цена = минимальная цена товара

в этой группе, но не 0.

Если все товары группы имеют цену 0, то тогда цена = 0

Запрос ниже выводит все нормально, но, если в группе попадается товар с нулевой ценой, то отображает цену

группы как 0

связь между таблицами

catalog.type=groups.title

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

SELECT u.id, u.title, p0.price, p0.type

FROM groups u JOIN catalog p0
ON p0.id = ( SELECT p1.id
FROM catalog p1
WHERE p1.type=u.title
ORDER BY p1.price ASC
LIMIT 1)

LIMIT 0,10
C
На сайте с 28.01.2010
Offline
70
#1

Ох.

Немного индусского кода:


SELECT TYPE , title, price
FROM (
SELECT TYPE , title, if( max( price ) =0, 0, min( price ) ) AS price
FROM catalog
WHERE price !=0
GROUP BY TYPE
UNION SELECT TYPE , title, if( max( price ) =0, 0, min( price ) ) AS price
FROM catalog
GROUP BY TYPE
) a
GROUP BY TYPE
Это - личная подпись. Здесь обычно ставят ссылки на всякие кривые сайты, надеясь получить "жирный бек".
f0x
На сайте с 20.09.2006
Offline
116
f0x
#2
Counselor:
Ох.
Немного индусского кода:


SELECT TYPE , title, price
FROM (
SELECT TYPE , title, if( max( price ) =0, 0, min( price ) ) AS price
FROM catalog
WHERE price !=0
GROUP BY TYPE
UNION SELECT TYPE , title, if( max( price ) =0, 0, min( price ) ) AS price
FROM catalog
GROUP BY TYPE
) a
GROUP BY TYPE

Фигасе)))

Не сработало.

T
На сайте с 19.12.2006
Offline
101
#3

telemad добавил 26.09.2011 в 22:17

потер. туплю.

сорри.

М
На сайте с 08.02.2006
Offline
59
#4


SELECT AA.*,(SELECT MIN(price) FROM catalog WHERE price>0 AND id=AA.id LIMIT 1) minprice FROM group AA

Выбрать только те группы, где минимальная цена больше нуля


SELECT * FROM (SELECT AA.*,(SELECT MIN(price) FROM catalog WHERE price>0 AND id=AA.id LIMIT 1) minprice FROM group AA) BB WHERE BB.minprice IS NOT NULL
Dreammaker
На сайте с 20.04.2006
Offline
569
#5

Магнат, что первый что второй вариант ошибку выдаёт.

Update: Сорри, я туплю - не знаю выдаёт ли ошибку ибо у меня только одна таблица (тут все равно денормализованные данные) - я пробовал этим путём пойти. :)

p.s. + ТСу за интересную задачу :)

MALCHUN
На сайте с 01.05.2009
Offline
71
#6

я в этом не разбираюсь и интересует какой запрос нужно сделать нсли к примеру в базе нужно заменить слово диван(в количестве мног) на слово кровать? а то я по сложному пути сливаю базу меняю в блокноте и заливаю

Хуже ссылочной биржи (http://www.linkfeed.ru/reg/59860) Я не видел :)
Shtogrin
На сайте с 02.11.2006
Offline
95
#7

SELECT

groups.id,
groups.title,
IFNULL((SELECT MIN(catalog.price) FROM catalog WHERE catalog.type=groups.title AND catalog.price>0),0) AS price
FROM
groups
www.shtogrin.com (http://www.shtogrin.com/). Канцтовары (http://www.invit.com.ua/). 1С Бухгалтерия (http://account.kiev.ua/).
f0x
На сайте с 20.09.2006
Offline
116
f0x
#8

Не сработали варианты.

В любоем случае, спасибо.

Пока по-быдлятски придется делать, вытаскивать все группы, потом для каждой в отдельности выгребать цены и уже манипулировать данными.....

DA
На сайте с 19.05.2011
Offline
8
#9

Данный запрос выводит группы с минимальной ценой, не равной 0, но при этом исключает группы, в которых все товары с нулевой ценой:


select t.* from
(
select g.id,g.title,min(c.price)
from groups g join catalog c on g.title=c.type
where price>0 group by g.id,g.title
) t

Запрос выводит группы, в которых все цены =0 (проверка осуществляется функцией среднего значения)


select t.*
from
(
select g.id,g.title,avg(c.price) a
from groups g join catalog c on g.title=c.type
group by g.id,g.title
) t
where t.a=0

Теперь два запроса объединяем


select t.* from (select g.id,g.title,min(c.price) from groups g join catalog c on g.title=c.type where price>0 group by g.id,g.title) t
union
select t.* from (select g.id,g.title,avg(c.price) a from groups g join catalog c on g.title=c.type group by g.id,g.title) t where t.a=0
C
На сайте с 28.01.2010
Offline
70
#10
DmitryAnt:

Запрос выводит группы, в которых все цены =0 (проверка осуществляется функцией среднего значения)

О черт, я про avg забыл, пришлось с if извращаться.

Фигасе)))
Не сработало.

Ну это часть запроса, которая строит таблицу из catalog, выводя название группы и цену, нужно к нему еще джойн примутить. По крайней мере у меня сработало нормально.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий