За последние 24 часа нас посетил 34921 программист и 1712 роботов. Сейчас ищут 995 программистов ...

Выборка из двух таблиц

Тема в разделе "MySQL", создана пользователем A41524567, 23 июл 2014.

  1. A41524567

    A41524567 Активный пользователь

    С нами с:
    31 янв 2013
    Сообщения:
    74
    Симпатии:
    0
    MYSQLi , есть две таблицы:
    [​IMG]
    Первая таблица product - продукты со своими параметрами
    Вторая таблица option - расширенное описание продукта (его опции), кол-во опций - неизвестно, возможно их вообще нет для некоторых продуктов.
    связь данных product.product_id -> option.product_key
    Как зная только product.product_id получить одним запросом param_* (одна строка) и option_*(число строк - неизвестно). Два запроса - без проблем все решают.
    Если решение одним запросом реально - подскажите куда копать. Копать, зная в какую сторону - всегда готов.
     
  2. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    LEFT JOIN
     
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Может я чего н понял, но тут копать нечего. внешнее левое соединение
    Код (PHP):
    1. SELECT a.*, b.*
    2. FROM
    3.   product AS a LEFT JOIN
    4.   option AS b ON a.product_id = b.product_key
    5. WHERE a.product_id = :x
    для x == 12 выборка содержала бы ровно три строки.
    а если бы нужные option отсутствовали, то одна строка и поля option были бы пустыми

    http://sqldoc.net/7-outer-join.html
     
  4. A41524567

    A41524567 Активный пользователь

    С нами с:
    31 янв 2013
    Сообщения:
    74
    Симпатии:
    0
    Доброго дня. Спасибо за ответы, все понятно, все работает.
    Усложнилась задача - возникли проблемы:
    [​IMG]
    Первая таблица product - продукты со своими параметрами
    Вторая таблица option - расширенное описание продукта (его опции), кол-во опций - неизвестно, возможно их вообще нет для некоторых продуктов.
    Третья таблица pict - картинки продукта, кол-во неизвестно
    связь данных:
    product.product_id -> option.product_key
    product.product_id -> pict.product_key

    Вот тут и начинается веселуха.
    В запросе поставил два LEFT JOIN (сам запрос ниже, имена-переменные не стал править, только для примера показал сам запрос )
    Код (Text):
    1. SELECT  # СТРУКТУРА, ИМЕНА НЕ СОВПАЮТ СО СКРИНОМ, ТОЛЬКО КАК ПРИМЕР !!!!!!
    2.   bc.block_content_text_1,
    3.   bc.block_content_text_2,
    4.   bc.block_content_string_1,
    5.   bc.block_content_string_2,  
    6.   bc.block_content_string_3,
    7.   bc.block_content_string_4,
    8.   bc.block_content_string_5,
    9.   bc.block_content_string_6,  
    10.   bc.block_content_string_7,
    11.   bc.block_content_string_8,
    12.   opt.id_option,
    13.   bl.block_title,
    14.   opt.option_string_1,
    15.   opt.option_string_2,
    16.   opt.option_string_3,
    17.   opt.option_string_4,
    18.   pict.id_option_pict,
    19.   pict.pict_path
    20.   FROM block_content bc
    21.   LEFT JOIN block_list bl ON bc.block_id = bl.id
    22.   LEFT JOIN `option` opt ON bc.id = opt.option_product_id
    23.   LEFT JOIN `option_pict` pict ON pict.product_id = opt.option_product_id
    24.   WHERE bc.id='169'
    В ответе MYSQL получается 16 или больше строк, по логике все правильно, но разбирать такой ответ тоскливо - хлопотно - затратно.

    Как с этим бороться? Может не париться - сделать отдельные запросы?
     
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    это твое сугубое дело. мне кажется ты не с реальной задачей работаешь, а просто упражняешся для развлечения. пока нет задачи, нет и критериев что хорошо, а что плохо.

    сделай три запроса, why not?
     
  6. A41524567

    A41524567 Активный пользователь

    С нами с:
    31 янв 2013
    Сообщения:
    74
    Симпатии:
    0
    Задача как раз реальная. Решаю без суеты, параллельно разбираюсь во всем. Книжку почитал - вроде все понятно (или задачи-прооблемы по проще были), начал кодить - вопросов масса. Вот и разбираюсь, что сам не могу понять - спрашиваю.

    Спасибо за реальные ответы
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Пиши еще.

    Перечитал тему и хочу уточнить кое-что. Скажи пожалуйста, таблица option она реально связана с product как много-к-одному? Моя чуйка сигналит тревогу :)

    До сих пор как-то попадалось два варианта "расширенных атрибутов":
    а) таблица со множеством колонок. либо это просто распухший product, либо доп. таблица со связью 1:1 в которой бОльшая часть колонок обычно пустые
    б) таблица Entity-Attribute-Value, по одному атрибуту на запись. связь с product много-к-одному.

    Не могу понять расклад, в котором бы понадобилось иметь и то и другое: многоколоночную таблицу со связью много-к-одному.
    Поговорим об этом?
     
  8. A41524567

    A41524567 Активный пользователь

    С нами с:
    31 янв 2013
    Сообщения:
    74
    Симпатии:
    0
    Все!!! Понял!!! Спасибо!!!!
    Основное - понять , что нужно получить.
    Моя ошибка - создал две таблицы для опций.
    Правильное решение - одна таблица option. В этой таблице хранить и опции, и картинки. При таком варианте сама таблица option будет похожа на "решето" - много пустых ячеек.
    Вариант Entity-Attribute-Value как-то не нравиться, один из аргументов против - кол-во опций конечно и заранее определено, и одинаково для всех опций.
    Глобально - спасибо, что направили на путь истинный!