Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Помогите с хитрым запросом. Весь мозг порушил (Aлексей) 22/06/2009 - 14:04:57
      Re: Помогите с хитрым запросом. Весь мозг порушил (PeaceCoder) 25/06/2009 - 22:15:12

> Original message text:
> From: Aлексей - 22/06/2009 - 14:04:57
> Subject:Помогите с хитрым запросом. Весь мозг порушил
> -----------------
> Добрый день.
> Имеется таблица goods. В ней хранятся списки товаров. Из этой таблицы нужно сделать выборку определенных полей таким вот образом:
> SELECT gid, gname FROM goods WHERE bid=$bid LIMIT $startpos, $maxperpage
> Поле bid - идентификатор родительского каталога (связь многие к одному).
>
> Далее, имеется таблица prop и в ней присутствуют следующие поля:
> CREATE TABLE IF NOT EXISTS `properties` (
> `id` int(11) NOT NULL auto_increment,
> `parent_id` int(11) NOT NULL default '0',
> `type_id` int(11) NOT NULL,
> `gid` int(11) NOT NULL,
> `value` text NOT NULL,
> PRIMARY KEY (`id`)
> )
> Так, каждой записи в таблице goods может соответствовать несколько записей из таблицы prop, но это не все. Поле prop.parent_id указывает на ID родительского атрибута, то есть структура атрибутов хранится в виде дерева: каждому атрибуту prop.id могут соответствовать свои атрибуты. Если parent_id=NULL, значит это "корневой" атрибут и он принадлежит непосредственно товару из таблицы goods.
>
> Поясню на примере. Вот как хранятся артибуты для одного из товаров:
>
> INSERT INTO `prop` (`id`, `parent_id`, `type_id`, `gid`, `value`) VALUES
> (1, 0, 1, 795, 'man'),
> (2, 1, 2, 795, '3400'),
> (7, 1, 3, 795, 'blue'),
> (8, 1, 3, 795, 'black'),
> (10, 0, 1, 795, 'woman'),
> (11, 10, 2, 795, '4000'),
> (12, 10, 3, 795, 'red'),
> (13, 10, 3, 795, 'yellow'),
> (14, 10, 3, 795, 'white'),
> (15, 10, 3, 795, 'orange'),
> (16, 10, 3, 795, 'blue'),
> (17, 10, 3, 795, 'black')
> Поле type_id указывает на тип атрибуты. Здесь 1 - пол, 2 - цена и 3 - цвет. Здесь товар goods.gid=795 бывает для девочек и для мальчиков, мужские джинсы стоят 3400 и бывают синие и черные. Женские стоят 4000 и бывают сами видите какие.
>
> Теперь перехожу к сути вопроса =) Как мне сделать такой запрос, чтобы для всех товаров, которые выберутся по условию goods.bid=$bid, выбирались данные по цене и по цветам. Причем, как видите, одному товару может соответствовать 2 (иногда и больше) цены - нужна минимальная из них (или, на худой конец, первая в записи). И может быть несколько цветов, нужно выбрать все возможные, но так, чтобы они не дублировались.
> И можно ли вообще выцепить все эти данные в рамках одного-единственного запроса?
>
> Пока я решил вопрос таким образом, что сначала я делаю просто выборку всех товаров по bid и потом в цикле для каждого из них гоняю отдельный запрос в таблицу prop. Все работает, но очень тормозит.
>
> Помогите, плиз. Спасибо за внимание и потраченное время.
>


From: PeaceCoder - 25/06/2009 - 22:15:12
Subject:Помогите с хитрым запросом. Весь мозг порушил
-----------------
SELECT *,
(SELECT gname FROM goods WHERE bid = Mp.gid) AS gname
FROM prop AS Mp WHERE gid IN
(SELECT bid FROM goods ORDER BY gname)
ORDER BY parent_id, type_id, value

попробуй это. должно вывести все товары которые обозначены в goods отстортированные сначала по man|girl, потом по price|color потом по price_value|name_value


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
35800



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |