SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 14.11.2011 01:53:18

Botchal
Участник
Откуда: Санкт-Петербург
Зарегистрирован: 14.10.2011
Сообщений: 11

join нескольких таблиц с croup_concat

Здравствуйте товарищи!
У меня нужно объеденить несколько таблиц, и с каждой таблицы, поскольку ключи совпадают в нескольких записях, group_concat (для дальнейшей распилки в пхп).
Структура:


/*товары*/
CREATE TABLE `shop_goods` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(200) NOT NULL DEFAULT 'продукт',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
/*------------------------------------------------------------------------------------*/
/*наборы товаров*/
CREATE TABLE `shop_product_type` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(200) NOT NULL DEFAULT 'набор продуктов',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

/*таблица с ключами. id_product - ключ к товару, id_type - ключ к набору*/
CREATE TABLE `shop_product_type_keys` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `id_product` int(6) DEFAULT '0',
  `id_type` int(6) DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
/*------------------------------------------------------------------------------------*/
/*классы товаров*/
CREATE TABLE `shop_product_class` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(200) NOT NULL DEFAULT 'класс продуктов',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

/*таблица с ключами. id_product - ключ к товару, id_type - ключ к классу*/
CREATE TABLE `shop_product_class_keys` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `id_product` int(6) DEFAULT '0',
  `id_class` int(6) DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

 


Делаю запрос (запостил упрощённые модели таблиц, может в посте в синтаксисе ошибся, но суть не в этом)

SELECT
shop_goods.name as product_name
group_concat(shop_product_type.name separator '||') as type_names,
group_concat(shop_product_class.name separator '||') as class_names

FROM shop_goods
LEFT JOIN shop_product_type_keys
ON shop_goods.id=shop_product_type_keys.id_product
LEFT JOIN shop_product_type
ON shop_product_type.id=shop_product_type_keys.id_type

LEFT JOIN shop_product_class_keys
ON shop_goods.id=shop_product_class_keys.id_product
LEFT JOIN shop_product_class
ON shop_product_class.id=shop_product_class_keys.id_class

GROUP BY 1;
 

И получается что он заходит в shop_product_class_keys не 1 раз в один продукт (как мне требуется), а столько, сколько записей в shop_product_type (или в shop_product_type_keys я честно говоря не понимаю всё до конца)


Подскажите, как сделать так, чтобы небыло лишних заходов в shop_product_class_keys ?
А то как на скрине получается одинаковые значения...


Прикрепленные файлы:
Attachment Icon left_join.jpg, Размер: 106,672 байт, Скачано: 355

админы украли подпись...

Неактивен

 

#2 16.11.2011 12:24:50

Botchal
Участник
Откуда: Санкт-Петербург
Зарегистрирован: 14.10.2011
Сообщений: 11

Re: join нескольких таблиц с croup_concat

group_concat(DISTINCT shop_product_class.name separator '||') as class_names

Вроде решил проблему, но не знаю как DISTINCT в group_concat влияет на работу базы. Выдаёт нормально, планирую у себя использовать кэширование, надеюсь всё получиться и база не будет падать.


админы украли подпись...

Неактивен

 

Board footer

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