Mysql SQL запрос

niko42

Новичок
Здравствуйте!

Есть две таблицы:

PHP:
CREATE TABLE IF NOT EXISTS `products` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `url` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `brand_id` int(11) DEFAULT NULL,
  `name` varchar(500) COLLATE utf8_unicode_ci NOT NULL,
  `description` text COLLATE utf8_unicode_ci,
  `params` text COLLATE utf8_unicode_ci,
  `visible` tinyint(1) NOT NULL DEFAULT '1',
  `meta_title` varchar(500) COLLATE utf8_unicode_ci DEFAULT NULL,
  `meta_keywords` varchar(500) COLLATE utf8_unicode_ci DEFAULT NULL,
  `meta_description` varchar(500) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `url` (`url`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ;

CREATE TABLE IF NOT EXISTS `img_product` (
  `product_id` int(11) NOT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `param` enum('original','default','big','small') COLLATE utf8_unicode_ci NOT NULL,
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Хочу вывести всё продукты + с фотографиями один запросом в БД. Уточните, пожалуйста, как это возможно - спасибо!
 

niko42

Новичок
Код:
select *,  `img_product`.`name` from `products`
left join `img_product` on `img_product`.`product_id` = `products`.`id`
Спасибо!
Александр Зеленин, а еще group by + group_concat а после explode
Уточните, пожалуйста, более детально - если это возможно. Спасибо!
 

WMix

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

niko42

Новичок
на 10 картинок будет 10 записей одного и того же продукта с разностью в 2 поля на картинки.
мне нравится первый ответ. лучше 2 запроса!
а я так пошутил предугадывая следующий вопрос
Спасибо!

Уточните, пожалуйста, возможно ли в запросе написать доп. внутренний (вложенный) запрос на подобие что-то этого: (SELECT * FROM `product` (SELECT * FROM `img_product` WHERE product_id = product.id))

Что бы не получился вывод:
PHP:
//P.S. каждая строчка новая ячейка в массиве.
Продукт 1 = Картинка 1
Продукт 1 = Картинка 2
Продукт 1 = Картинка 3
Продукт 1 = Картинка 4
Продукт 2 = Картинка 1
Продукт 2 = Картинка 2
Продукт 2 = Картинка 3
Продукт 2 = Картинка 4
Продукт 3 = Картинка 1
Продукт 3 = Картинка 2
Продукт 3 = Картинка 3
Продукт 3 = Картинка 4
Хочется вот так=)) :
PHP:
Продукт 1 = Картинка 1, Картинка 2, Картинка 3
Продукт 2 = Картинка 1, Картинка 2, Картинка 3
Продукт 3 = Картинка 1, Картинка 2, Картинка 3
Понимаю, что это бред - но, к сожалению, не хочу связываться с sql, как-то не дружу (времени не хватает почитать документацию =( )
 

niko42

Новичок
Добился чего хотел
PHP:
SELECT a.id, GROUP_CONCAT(b.img  SEPARATOR '::') AS img_product
                FROM `products` a
                LEFT JOIN `img_product` b ON a.id = b.product_id
                GROUP BY a.id
 

WMix

герр M:)ller
Партнер клуба
еще раз повторюсь,
мне нравится первый ответ. лучше 2 запроса!
PHP:
// http://www.phpfaq.ru/safemysql
// https://github.com/colshrapnel/safemysql/blob/master/safemysql.class.php

$products = $db->getInd('id','
    select *
    from `products`
');

$imgages = $db->getAll( '
    select *
    from `img_product`
    where product_id in(?a)
', array_keys($products) );

foreach($imgages as $image){
    $products[$image['product_id']]['images'][] = $image;
}

print_r($products);
 

niko42

Новичок
еще раз повторюсь,

PHP:
// http://www.phpfaq.ru/safemysql
// https://github.com/colshrapnel/safemysql/blob/master/safemysql.class.php

$products = $db->getInd('id','
    select *
    from `products`
');

$imgages = $db->getAll( '
    select *
    from `img_product`
    where product_id in(?a)
', array_keys($products) );

foreach($imgages as $image){
    $products[$image['product_id']]['images'][] = $image;
}

print_r($products);
Уточните, пожалуйста, почему так будет лучше?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
niko42, потому что сохраняется принцип логики, где одна сущность > несколько ее привязок, а не соединенные через непойми что картинки в одном поле
Да и есть к тому же фейл в твоем решении, рано или поздно ты в него можешь упереться и называется он - group_concat_max_len =) Который не даст строки более 1024 символов (по-дефолту)

Последнее время мания прям пошла делать "усе одним запросом", нихрена оно не взлетит в реальных условиях. Надо сразу пытаться писать нормально. Приведу пример, а если тебе надо будет выплюнуть эти данные стороннему разработчику, как бы сделать API, закодируешь ты все в JSON, а разработчик будет думать, что ты "неправ", ведь ему придется парсить твои строчки.
 

niko42

Новичок
niko42, потому что сохраняется принцип логики, где одна сущность > несколько ее привязок, а не соединенные через непойми что картинки в одном поле
Да и есть к тому же фейл в твоем решении, рано или поздно ты в него можешь упереться и называется он - group_concat_max_len =) Который не даст строки более 1024 символов (по-дефолту)

Последнее время мания прям пошла делать "усе одним запросом", нихрена оно не взлетит в реальных условиях. Надо сразу пытаться писать нормально. Приведу пример, а если тебе надо будет выплюнуть эти данные стороннему разработчику, как бы сделать API, закодируешь ты все в JSON, а разработчик будет думать, что ты "неправ", ведь ему придется парсить твои строчки.
Большое спасибо за пояснение. Впринципе я так и думал. Т.к. вдруг я еще расширю таблицу продуктов и добавлю какое-нибудь поле. А потом весь код переписывать, т.е. ячейки массива увеличелись.

P.S. возможно я и не прав в своем пояснение, то сильно не ругайте, лучше поясните. Буду очень признателен! Спасибо!
 

WMix

герр M:)ller
Партнер клуба
база данных не резиновая, а группировка результатов тяжелая операция.
 
Сверху