помогите сделать быборку из базы, куча таблиц

Тема в разделе "Базы данных", создана пользователем асс, 28 сен 2013.

Статус темы:
Закрыта.
Модераторы: latteo
  1. асс

    асс

    Регистр.:
    13 окт 2006
    Сообщения:
    756
    Симпатии:
    221
    Доброй ночи, уже весь мозг схавал не могу вкурить как выбрать из базы нужные данные.

    есть таблицы
    product тут есть поле image
    product_description
    product_to_store.
    product_image тут есть поле image
    product_reward
    product_to_category
    url_alias

    все таблицы имеют связывающее поле product_id.

    мне необходимо выбрать из базы в цикле все данные из всех таблиц сразу.


    Проще говоря есть таблица продукт, в ней связи на другие таблицы, которые я указал выше.


    53 это product_id


    INSERT INTO `product` VALUES (53, 'Автомобиль', '', '', '', '', '', '', '', '', 7, 'big/T.jpg', 0, 1, 2300.0000, 1, 0, 1);
    INSERT INTO `product_image` VALUES ('', 53, 'small/ T.jpg', 0);
    INSERT INTO `product_reward` VALUES ('', 53, 1, 0);
    INSERT INTO `product_description` VALUES (53, 1, 'Авто', 'Авто', 'Авто', 'Авто', 'Авто', '');

    И так далее.

    Как это добро выбрать одним махом.
     
  2. esche

    esche

    Регистр.:
    9 авг 2009
    Сообщения:
    359
    Симпатии:
    243
    Зачем? Длинный JOIN (особенно с учётом many-to-many таблиц и product_to_category product_to_store, которые приведут к увеличению числа строк в результате) хуже нескольких простых запросов. Тем более, (раз используется цикл) есть возможность их обработать результат в скрипте.
     
  3. асс

    асс

    Регистр.:
    13 окт 2006
    Сообщения:
    756
    Симпатии:
    221

    Подскажите как сделать в цикле у меня конструкция вида
    Код:
    if(mysql_num_rows($dd) >0) {
    while ($r = mysql_fetch_array($dd)){
     
  4. esche

    esche

    Регистр.:
    9 авг 2009
    Сообщения:
    359
    Симпатии:
    243
    while - это уже цикл.. до тех пор, пока в результате есть необработанные строки.
     
  5. асс

    асс

    Регистр.:
    13 окт 2006
    Сообщения:
    756
    Симпатии:
    221
    Я знаю что это цикл, я могу сделать выборку из 2х ьаблиц но как ее сделать из 5.

    например у меня product_id есть у всех таблиц, но сложность тут в том что image есть тоже у двух таблиц.

    Если я выбираю t1 и t2 то where t1.product_id=t2.product_id получаю данные, но как мне сделать чтоб t3.image=t1.image.
     
  6. esche

    esche

    Регистр.:
    9 авг 2009
    Сообщения:
    359
    Симпатии:
    243


    Зачем делать (в условии?) t3.image=t1.image? При том, что в Вашем примере (из первого поста) они не равны и выборки просто не будет.
     
  7. асс

    асс

    Регистр.:
    13 окт 2006
    Сообщения:
    756
    Симпатии:
    221
    как выбрать картинку из этих таблиц которые ниже.
    product тут есть поле image
    product_image тут есть поле image

    При этом выборку надо делать из еще нескольких таблиц.
     
  8. esche

    esche

    Регистр.:
    9 авг 2009
    Сообщения:
    359
    Симпатии:
    243
    Если не получается сформулировать/решить задачу целиком - решай по частям.

    Код:
    SELECT image from product;
    SELECT image from product_image; 
    Первый запрос достанет поле image из таблицы product, второй - из таблицы product_image
    Если добавить WHERE - можно ограничиться меньшим количеством строк.. в частности, одной строкой где product_id = {чему-нибудь конкретному}, например 53

    Когда дойдёт очередь до следующих таблиц - дальше смотреть.. Если нет целостной картины... Если есть - повторюсь, сформулировать ЧЁТКО "что и куда", а не "несколько таблиц" и сделать.

    Когда будет рабочий вариант - при необходимости оптимизировать (к примеру, разумный JOIN вставить, или выбор всех строк и разбор уже в скрипте)

    Что в итоге нужно? "просто выбрать"? В массив (структура какая?) преобразовать? Дальше выводить в табличке? Сохранить в файл? В каком формате данные нужны?
     
  9. arman29

    arman29 Генератор идей

    Moderator
    • Супермодератор
    Регистр.:
    30 июн 2008
    Сообщения:
    1.235
    Симпатии:
    662
    вы вообще учили SQL? Там есть такая функция как Inner Join. Почитайте, пожалуйста, о ней. В принципе данную выборку сделать через нее будет легко

    а если что-то "зациклить" хотите, то тригеры вам в помощь

    Если выложите скрины таблиц, то думаю найдутся умельцы, которые помогут вам написать нужный SQL-запрос (если я вам не успею написать), т.к. трудно понять, что именно есть и из какой таблицы тянется
     
  10. esche

    esche

    Регистр.:
    9 авг 2009
    Сообщения:
    359
    Симпатии:
    243
    Вся сложность в том, что не ясно, "какая выборка" нужна... особенно с учётом таблиц many-many - будет много строк на 1 товар. (да и таблица product_image, видимо, не по первичному ключу JOIN-ится... т.е. возможны дубли.)

    Полям с одинаковыми именами можно через AS задавать псевдонимы
    Код:
    SELECT *, p.image as p_image, pi.image as pi_image FROM `products` p
    INNER JOIN product_description pd USING(product_id)
    INNER JOIN product_image as pi USING(product_id) 
    если, конечно, это интересующая часть ответа...
     
    асс нравится это.
Статус темы:
Закрыта.