За последние 24 часа нас посетили 50930 программистов и 1740 роботов. Сейчас ищут 903 программиста ...

Выборка из 3-х таблиц mysql

Тема в разделе "PHP и базы данных", создана пользователем lammer, 13 сен 2014.

  1. lammer

    lammer Новичок

    С нами с:
    13 сен 2014
    Сообщения:
    12
    Симпатии:
    0
    Привет всем.
    Подскажите как составить запрос к базе. Или возможно надо спроектировать заново структуру бд.
    Есть 3 таблицы:
    1. categories (id, name)
    2. products (id, cat_id, product)
    3. models (id, prod_id, model, price)

    1-я табл. содержит категории: "Эконом", "Стандарт", "Премиум"
    2-я табл. содержит продукции: Sony, Panasonic, Samsung, Lg, ...
    3-я табл. содержит модели для каждой продукции: KDL-42W705B, TX-PR55ST60, UE32H5500, ...

    Соб-но, необходимо вывести каталог из 3 таблиц. Хотелось бы от запроса получить:
    1. Эконом: Panasonic TX-PR55ST60, Samsung UE32H5500.
    2. Стандарт: Sony KDL-42W705B
    и тд.
     
  2. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    затык в чем?
     
  3. lammer

    lammer Новичок

    С нами с:
    13 сен 2014
    Сообщения:
    12
    Симпатии:
    0
    Вопрос правильном и оптимальном составе запроса. Делаю пока так:
    Код (Text):
    1. SELECT c.name,
    2.     GROUP_CONCAT(p.product) AS products,
    3.     GROUP_CONCAT(m.model) AS models
    4. FROM `models` m
    5.     JOIN `products` p
    6.         ON p.id = m.prod_id
    7.     JOIN `categories` c
    8.         ON c.id = p.cat_id
    9. GROUP BY c.id
    В итоге получаю ответ:
    Код (Text):
    1. 1. Эконом
    2.     Panasonic, Samsung
    3.     TX-PR55ST60, UE32H5500
    4. 2. Стандарт
    5.     Sony
    6.     KDL-42W705B
    7. ... и тд.
    Как бы затем сплитом разбиваю строки на массивы и соединяю продукт + модель. Но мне кажется, что можно как-то лучше и оптимальней составить запрос. Время выборки занимает от 150-850 мс. Все 3 таблицы в сумме пока имеют около 50 записей. Можно ли как-то оптимизировать запрос?
     
  4. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    А чем вам не угодило
    Код (Text):
    1.  
    2. select c.name category, p.name product, m.name model
    3. from categories c
    4. left join products p on p.cat_id = c.id
    5. left join models m on m.prod_id = p.id
    А склеите как вам надо уже в РНР. Ну реально, 850 мс на 50 записей - это трындец какой-то.
     
  5. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    три запроса тоже неплохой варик.
     
  6. lammer

    lammer Новичок

    С нами с:
    13 сен 2014
    Сообщения:
    12
    Симпатии:
    0
    Хыиуду, я не знаю в чём прикол, но ваш запрос занимает всего 0.0010 сек. !!!! Спасибо. Хотя, я так делал изначально, но не проверял длительность запроса. Действительно, я лучше получу ответ не совсем в удобном виде и обработаю php-скриптом, чем жертвовать производительностью.
    igordata, а вообще это нормальная практика разделять обращение к бд несколькими запросами?

    П.с: спасибо за ответы.
     
  7. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    нормальная практика делать или как удобнее, или как эффективнее. =)