MYSQLi , есть две таблицы: Первая таблица product - продукты со своими параметрами Вторая таблица option - расширенное описание продукта (его опции), кол-во опций - неизвестно, возможно их вообще нет для некоторых продуктов. связь данных product.product_id -> option.product_key Как зная только product.product_id получить одним запросом param_* (одна строка) и option_*(число строк - неизвестно). Два запроса - без проблем все решают. Если решение одним запросом реально - подскажите куда копать. Копать, зная в какую сторону - всегда готов.
Может я чего н понял, но тут копать нечего. внешнее левое соединение Код (PHP): SELECT a.*, b.* FROM product AS a LEFT JOIN option AS b ON a.product_id = b.product_key WHERE a.product_id = :x для x == 12 выборка содержала бы ровно три строки. а если бы нужные option отсутствовали, то одна строка и поля option были бы пустыми http://sqldoc.net/7-outer-join.html
Доброго дня. Спасибо за ответы, все понятно, все работает. Усложнилась задача - возникли проблемы: Первая таблица product - продукты со своими параметрами Вторая таблица option - расширенное описание продукта (его опции), кол-во опций - неизвестно, возможно их вообще нет для некоторых продуктов. Третья таблица pict - картинки продукта, кол-во неизвестно связь данных: product.product_id -> option.product_key product.product_id -> pict.product_key Вот тут и начинается веселуха. В запросе поставил два LEFT JOIN (сам запрос ниже, имена-переменные не стал править, только для примера показал сам запрос ) Код (Text): SELECT # СТРУКТУРА, ИМЕНА НЕ СОВПАЮТ СО СКРИНОМ, ТОЛЬКО КАК ПРИМЕР !!!!!! bc.block_content_text_1, bc.block_content_text_2, bc.block_content_string_1, bc.block_content_string_2, bc.block_content_string_3, bc.block_content_string_4, bc.block_content_string_5, bc.block_content_string_6, bc.block_content_string_7, bc.block_content_string_8, opt.id_option, bl.block_title, opt.option_string_1, opt.option_string_2, opt.option_string_3, opt.option_string_4, pict.id_option_pict, pict.pict_path FROM block_content bc LEFT JOIN block_list bl ON bc.block_id = bl.id LEFT JOIN `option` opt ON bc.id = opt.option_product_id LEFT JOIN `option_pict` pict ON pict.product_id = opt.option_product_id WHERE bc.id='169' В ответе MYSQL получается 16 или больше строк, по логике все правильно, но разбирать такой ответ тоскливо - хлопотно - затратно. Как с этим бороться? Может не париться - сделать отдельные запросы?
это твое сугубое дело. мне кажется ты не с реальной задачей работаешь, а просто упражняешся для развлечения. пока нет задачи, нет и критериев что хорошо, а что плохо. сделай три запроса, why not?
Задача как раз реальная. Решаю без суеты, параллельно разбираюсь во всем. Книжку почитал - вроде все понятно (или задачи-прооблемы по проще были), начал кодить - вопросов масса. Вот и разбираюсь, что сам не могу понять - спрашиваю. Спасибо за реальные ответы
Пиши еще. Перечитал тему и хочу уточнить кое-что. Скажи пожалуйста, таблица option она реально связана с product как много-к-одному? Моя чуйка сигналит тревогу До сих пор как-то попадалось два варианта "расширенных атрибутов": а) таблица со множеством колонок. либо это просто распухший product, либо доп. таблица со связью 1:1 в которой бОльшая часть колонок обычно пустые б) таблица Entity-Attribute-Value, по одному атрибуту на запись. связь с product много-к-одному. Не могу понять расклад, в котором бы понадобилось иметь и то и другое: многоколоночную таблицу со связью много-к-одному. Поговорим об этом?
Все!!! Понял!!! Спасибо!!!! Основное - понять , что нужно получить. Моя ошибка - создал две таблицы для опций. Правильное решение - одна таблица option. В этой таблице хранить и опции, и картинки. При таком варианте сама таблица option будет похожа на "решето" - много пустых ячеек. Вариант Entity-Attribute-Value как-то не нравиться, один из аргументов против - кол-во опций конечно и заранее определено, и одинаково для всех опций. Глобально - спасибо, что направили на путь истинный!