singlepost

MYSQL сложный запрос << На главную или назад  

Здравствуйте! Помогите, пожалуйста,спроектировать базу данных.
Предполагается, что в базе хранится описание некоего развлекательного комплекса(название, описание, количество персонала, и другие параметры). В этом комплексе есть магазины(название, короткое описание, полное описание, дата открытия, и другие параметры).

На главную страницу надо вывести всё это дело, но(!) тут есть одно но.
Если в комплексе всего один магазин, то выводим название магазина, полное описание и дату открытия. Если в комплексе не один магазин, то выводим название комплекса, описание комплекса и короткие описания всех его магазинов.

С построением такой сложной(для меня) системы столкнулся впервые. Уже несколько дней думаю над тем, как именно организовать базу данных, чтобы можно было без проблем всё это из нее вытащить при минимальной нагрузке на сервер. Может кто-то имеет опыт работы со сложными таблими и сложными запросами?Очень бы хотелось услышать какой-либо из ваших вариантов проектирования данной базы и, если можно, пример запроса

53 ответов в теме “MYSQL сложный запрос”

  1. 16
    Андрей Fam ответил:

    сорри, понял о чем Вы, да, ошибка
    нужно ON complex.id = shops.complex_id вместо ON complex.id == shops.complex_id

  2. 15
    Александр Тарантей ответил:

    а что это за сравнение в sql:

    FROM complex JOIN shops ON complex.id == shops.complex_id

    давно вввели?

  3. 14
    Андрей Fam ответил:

    INNER JOIN ? google ?

  4. 13
    Андрей Fam ответил:

    SELECT complex.id, complex.count_shops, complex.title, complex.descr, complex.count_workers,shops.id,shops.complex_id,shops.title,shops.full_desrc,shops.short_desrc,shops.count_workers,shops.creation_date
    FROM complex JOIN shops ON complex.id == shops.complex_id

    запрос по идее может быть примерно таким, ну или таким :

    SELECT C.id, C.count_shops, C.title, C.descr, C.count_workers,S.id,S.complex_id,S.title,S.full_desrc, S.short_desrc,S.count_workers,S.creation_date
    FROM complex AS C JOIN shops AS S
    ON complex.id == shops.complex_id

    p.s. в таблице complex у тебя есть`litle` varchar(255) NOT NULL, мб ты тут хотел все же title написать, а не litle?

  5. 12
    Александр Тарантей ответил:

    #8 явная ошибка проектирования базы, как в #11 гораздо лучше.

    В #9 рациональное начало есть, только можно еще в запросе проверять кол-во магазинов чтобы лишний раз не отправлять запрос. По уму, раз уж так печетесь о лишнем запросе, то введите поле, shops_count в таблице с комплексами и повесьте триггер, который будет сам считать кол-во магазинов и сразу можно в запросе сделать что-то вроде IF(shops_count=1,'select всю инфу о магазе', 'выбираем которткую инфу о всех магазинах')

  6. 11
    Макс Смерч ответил:

    Guran Guran, для генерации страницы, допустим с20тью комплексами, таким методом, мы получим тонну запросов в базу оО

    Андрей, да, так наверное будет лучше.

    На всякийслучай вот актуальный дамп базы //dumpz.org/17716/

  7. 10
    Guran Guran ответил:

    ну пардон.. сказал как знал.
    если есть что-то лучше, как узнаешь поделись, буду рад.

  8. 9
    Андрей Fam ответил:

    хм, может стоило бы убрать строку `shops_id` varchar(255) NOT NULL, а то получается, что имея комплекс с 1000 магазинами, ты получишь не 1 строку с комплексом в БД, а 1000…явный избыток,попробуй просто в shops добавь id комплекса, в котором этот магазин находится, так будет разумнее, а в complex можно оставить строку с кол-вом магазином в нем и все

  9. 8
    Guran Guran ответил:

    $sql = "SELECT id FROM kompleks";
    $res = mysql_query($res);

    if(mysql_num_rows($res) > 1){
    while($row =mysql_fetch_array($res)){
    $sql2 = "SELECT * FROM magazin WHERE id_kompleks_fk='" . $row['id'] . " ' ";
    $res2 = mysql_query($sql2);

    while($row2 =mysql_fetch_array($res2)){
    echo "<td>" . $row['nazvanie_kompleksa'] . "</td>";
    echo " остальная инфа … если магазинов больше чем 1";
    }

    }else{

    while($row =mysql_fetch_array($res)){
    $sql2 = "SELECT * FROM magazin WHERE id_kompleks_fk='" . $row['id'] . " ' ";
    $res2 = mysql_query($sql2);

    while($row2 =mysql_fetch_array($res2)){
    echo "инфа если магазин 1";
    }

    }

  10. 7
    Макс Смерч ответил:

    Вот пока такая таблица получилась//dumpz.org/17708/
    Сделал еще небольшую картинку для наглядности //s002.radikal.ru/i198/1003/8d/c0d9a22ac8b5.jpg
    Сейчас пробую сделать выборку из получившейся базы данных.
    Только пока не очень представляю, как выбрать это всё

  11. 6
    Андрей Fam ответил:

    угу, в первой таблице будет инфа о комплексах, вторая будет содержать инфу про магазины, но в первой будет id магазинов, и делая выборку из первой таблицы ,можно сразу сделать условие с проверкой, один магазин или более в этом комплексе

  12. 5
    Александр Тарантей ответил:

    викуля молодец, когда нечегео сказать надо сказать хоть что-то, я так понимаю?!

    решается данный вопрос программно, по сути тут две таблицы. Select'ом выгребаешь комплексы, а дальше куча решений, голь на выдумку хитра.
    Можно и подзапросом все вернуть сразу, как душе угодно

  13. 4
    Макс Смерч ответил:

    их будет больше чем один, и у каждого может быть n'ное количество магазинов. И надо как-то выводить на одной странице все комплексы.
    Не могу продумать строение базы данных, что это все извлекалось без лишних параметров

  14. 3
    Андрей Fam ответил:

    комплексов может быть более чем один, правильно?

  15. 2
    Макс Смерч ответил:

    Причем тут mysql_num_rows?

  16. 1
    Викуля Куранова ответил:

    mysql_num_rows ?

    Это всё легко делается, но это нужно видеть и представлять перед собой:)

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.