Как организовать ссылки на изображения для товаров в БД?

dredder

Кэп
Делаю маленький каталожек товаров. Там у меня у каждого товара есть слайдер с несколькими изображениями. Т.е. к одному товару относится сразу несколько изображений. Я создал таблицу с параметрами товара:
Код:
CREATE TABLE doob.goods (
  id int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  id_category varchar(255) NOT NULL,
  name varchar(50) DEFAULT NULL,
  description varchar(255) DEFAULT NULL,
  price decimal(19, 2) DEFAULT 0.00,
  PRIMARY KEY (id)
)
ENGINE = INNODB
AUTO_INCREMENT = 6
AVG_ROW_LENGTH = 3276
CHARACTER SET utf8
COLLATE utf8_general_ci
ROW_FORMAT = DYNAMIC;
И таблицу с ссылками на изображения к каждому товару. Тут good_id это id товара из
doob.goods, а link это соответствующая ссылка на изображение
Код:
CREATE TABLE doob.images (
  good_id int(10) UNSIGNED DEFAULT NULL,
  link varchar(255) DEFAULT NULL,
)
ENGINE = INNODB
AVG_ROW_LENGTH = 4096
CHARACTER SET utf8
COLLATE utf8_general_ci
ROW_FORMAT = DYNAMIC;
Затем я сделал вот такую процедуру для сбора данных из категории:
Код:
PROCEDURE doob.catalog_get_products_in_category(IN inCategoryId int)
BEGIN
SELECT g.id, g.name, g.description, g.price FROM goods g
    INNER JOIN category c
                 ON g.id_category = c.id
    WHERE      c.id = inCategoryId
    ORDER BY   g.id DESC;
END
Теперь мне нужно всё складывать в один массив $data, чтобы потом этот массив разбирать уже в шаблоне. А я не могу сообразить, как собрать в один запрос как основные данные: name, description, price так и все картинки, относящиеся к этому товару.

Если обращаться к таблице с изображениями в отдельной процедуре, то придётся как-то вытаскивать good_id нужного товара, а потом ещё и скреплять это всё с остальным массивом.

Не подскажите, дорогие знатоки, как можно это сделать попроще?
 

WMix

герр M:)ller
Партнер клуба
вопрос двоякий, пойми следующее что база на запрос вернет всегда таблицу, те. использование join с одной стороны решает проблему выборки с другой перекладывает на тебя работу группировки.
внимание ответ: убрать процедуру, это лишнее и обрекает тебя на проблемы еще более сложного характера.

выбор же между "выбрать товар одним запросом а после вторым картинки" или "выбрать товар и картинки а после группировать на php уровне" предоставляю тебе. первый подразумевает большую скорость при низком посещении второй низкую при большом посещении (если без трюков)
 

dredder

Кэп
вопрос двоякий, пойми следующее что база на запрос вернет всегда таблицу, те. использование join с одной стороны решает проблему выборки с другой перекладывает на тебя работу группировки.
внимание ответ: убрать процедуру, это лишнее и обрекает тебя на проблемы еще более сложного характера.

выбор же между "выбрать товар одним запросом а после вторым картинки" или "выбрать товар и картинки а после группировать на php уровне" предоставляю тебе. первый подразумевает большую скорость при низком посещении второй низкую при большом посещении (если без трюков)
Код:
SELECT `g`.`id`, `g`.`name`, `g`.`description`, `g`.`price`, `i`.`images`
  FROM `goods` AS `g`
  LEFT JOIN (
    SELECT `good_id`, GROUP_CONCAT(`link` SEPARATOR ',') AS `images`
    FROM `images`
    GROUP BY `good_id`
  ) AS `i` ON `i`.`good_id` = `g`.`id`
  WHERE  `g`.`id_category` = :category
  ORDER BY `g`.`id` DESC;
Вот так решил проблему в итоге
 

WMix

герр M:)ller
Партнер клуба
если, то
Код:
SELECT `g`.`id`, `g`.`name`, `g`.`description`, `g`.`price`, GROUP_CONCAT(`link` SEPARATOR ',') AS `images`
FROM `goods` AS `g`
LEFT JOIN `images` AS `i` ON `i`.`good_id` = `g`.`id`
WHERE  `g`.`id_category` = :category
GROUP BY `g`.`id`
ORDER BY `g`.`id` DESC;
 

antson

Новичок
Партнер клуба
@dredder, не знаю как у тебя построен дизайн. Но обычно у товара бывают превью для списков. а также среди иллюстраций бывает главное изображение.
Ну а там в зависимости от специфики каталога. Разные расцветки / артикулы.

выборка же всех иллюстраций требуется только на странице самого товара. А тут главное наличие индекса по good_id для быстрого поиска в таблице иллюстраций
 
Сверху