За последние 24 часа нас посетили 17507 программистов и 1721 робот. Сейчас ищут 1494 программиста ...

Запрос с объединением трёх таблиц

Тема в разделе "MySQL", создана пользователем Булат Азат улы, 9 апр 2023.

  1. Булат Азат улы

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

    С нами с:
    31 авг 2017
    Сообщения:
    61
    Симпатии:
    6
    Адрес:
    Республика Татарстан, город Казань
    Всех приветствую, товарищи!
    Имею свой сервис бытовой техники, делаю сайт. Есть 3 таблицы:
    1 - "marka" - столбцы "id", "marka", "comment" - список марок бытовой техники;
    2 - "model" - столбцы "id", "model", "markaID", "comment" - большой список разных аппаратов;
    3 - "remont" - столбцы "id", "modelID", "time", "SN", "clientID", "status", "comment" и др. - список аппаратов, которые на ремонте.
    Надо вывести таблицу, которая должна состоять из столбцов "Аппарат" (марка, модель), "Дата принятия", "Состояние ремонта", "Клиент".
    То есть мне нужно запрос
    Код (Text):
    1. SELECT id, time, clientID, modelID, status FROM remont ORDER BY time
    доработать так, чтобы вместо "modelID" я получил "model", связавшись по id и ещё раз получил "marka", связавшись по "markaID" с таблицы "model" на таблицу "marka".

    Не могли бы помочь с получением данного запроса?
     
  2. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.487
    Симпатии:
    281
    Код (Text):
    1.  
    2. SELECT `marka`.`marka`, `model`.`model`,
    3. `remont`.`time`, `remont`.`status`,
    4. `remont`.`clientID`
    5. FROM `marka`, `model`, `remont`
    6. WHERE `marka`.`id` = `model`.`markaID`
    7. AND `model`.`id` = `remont`.`modelID`
    8. ORDER BY `remont`.`time`
     
    #2 Drunkenmunky, 9 апр 2023
    Последнее редактирование: 9 апр 2023
    Булат Азат улы нравится это.
  3. Булат Азат улы

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

    С нами с:
    31 авг 2017
    Сообщения:
    61
    Симпатии:
    6
    Адрес:
    Республика Татарстан, город Казань
  4. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.487
    Симпатии:
    281
    Важно понимать, что если в одной или второй из первых двух таблиц отсутствует соответствие в последующей таблице, то эта строка из выборки будет опущена.
    Для её отображения следует использовать "левое" объединение, где отсутствующее значение будет заменено на NULL.
    Но такое объединение не имеет настолько же простого аналога синтаксиса, как выше.
     
    Булат Азат улы нравится это.
  5. Slava Rozhnev

    Slava Rozhnev Новичок

    С нами с:
    6 сен 2021
    Сообщения:
    87
    Симпатии:
    26
    Адрес:
    https://phpize.online
    Никогда так не делайте. Пишите норманые запросы с JOIN
     
    Булат Азат улы нравится это.
  6. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.487
    Симпатии:
    281
    Скажите наркотикам "нет"
    Ну, или дайте ссылку на источник "мудроты". Хоть поржем
     
  7. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    В целом, поддерживаю, потому что с JOIN нагляднее. Но ИМХО, слишком категоричное заявление. ))) В некоторых диалектах, например в Oracle 8i вообще нет/не было фразы JOIN, всё успешно выражается через WHERE. А для открытых соединений специальный синтаксис с (+)

    Это не к тому, что надо именно так писать, просто во многих источниках можно встретить такой синтаксис, потому что его использовал самый продвинутый на тот момент сервер БД.
     
    Булат Азат улы нравится это.
  8. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    Булат Азат улы нравится это.
  9. Булат Азат улы

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

    С нами с:
    31 авг 2017
    Сообщения:
    61
    Симпатии:
    6
    Адрес:
    Республика Татарстан, город Казань
    @artoodetoo@Drunkenmunky@Slava Rozhnev, спасибо вам всем большое!
    Так как в моём случае было желательно выводить всю информацию с одной таблицы, а с других добавлять по наличию в них информации, касательно строки с основной таблицы, я всё-таки выбрал вариант LEFT JOIN.
    Спасибо всем за "бурное" обсуждение по данной теме - получил для себя много новой информации.
     
    miketomlin и artoodetoo нравится это.
  10. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.487
    Симпатии:
    281
    Ну, так и добавили бы "марку" NoName и "модель" Unknown. Подобные задачи, где все поля формы обязательны к заполнению, так и решаются.
     
  11. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.839
    Симпатии:
    651
    Эти обобщенные NoName тоже могут «пропасть» из «словарей». Если их и использовать, то только как замену NULL'ам при выводе.

    Хотя в принципе, как дефолтные значения, вполне можно использовать. Если юзеру влом делать выбор при заполнении формы или в словарях пока нет нужных данных (он собирает расширить словари потом отдельно).
     
  12. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.487
    Симпатии:
    281
    Именно.

    Кстати, не обратил внимания сразу, более правильным, для этого случая, было бы держать `markaID` не в `model`, а таки тоже в `remont`. Иначе, хоть и редко, будут недоразумения - у производителей небогато с фантазией.
    Разве, что в Икее
     
  13. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.839
    Симпатии:
    651
    Почему?:eek: У ТС'а правильно! Марка – это зависимый от модели признак. В remont надо хранить только «независимые» (т.е. зависимые непосредственно от ремонтируемого девайса) признаки. См., как ТС это сделал с клиентом (хозяином ремонтируемого девайса).
    --- Добавлено ---
    Иерархия легко восстанавливается:
    Код (Text):
    1. LEFT JOIN model ON modelID=model.id LEFT JOIN marka ON markaID=marka.id
     
  14. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.487
    Симпатии:
    281
    Изделие, рано или поздно снимают с производства.
    А названия в базе остаются.
     
  15. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    Для записей, которые должны выйти из активного употребления, придумали "мягкое удаление" - не удаляем физически , а прописываем признак active=0 или дату deleted_at=now(). Таким образом, ссылочная целостность у исторических данных сохраняется. И при этом "удаленные" записи отфильтровываем в списках выбора.
     
  16. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.487
    Симпатии:
    281
    То есть еще одна колонка. И дополнительный фильтр.
     
  17. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    922
    Симпатии:
    143
    Можно в отдельные архивные таблицы переносить.
     
  18. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.487
    Симпатии:
    281
    Я и не говорю, что проблема нерешаема. Решаемо всё. Даже без дополнительных колонок и далее по списку.
    Но зачем усложнять базу, для которой и одной-то таблицы "за глаза".
    Если же в качестве учебной, то назначение неудачно выбрано.
    Лучше всего для этих целей какой-нибудь каталог с фильмами или книгами использовать.
    Тут тебе и сам фильм, и режиссеры с актерами, и жанры, и серии, и студии со странами проката...
    Учись-не хочу
     
  19. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    да, и что? не в этой конкретной выбрке от ТС, но где-то будет дополнительное условие.
    реальные базы состоят из сотни таблиц, каждая из десятка полей. задача хорошая для тренировки, потому что позволяет расти.
    --- Добавлено ---
    реально сейчас ТСу не нужны никакие "мягкие удаления". это просто информация для расширения кругозора . чтобы он понимал про целостность и как выводить из оборота старые записи без проблем.
     
  20. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.487
    Симпатии:
    281
    Я неправильно выразился.
    Кто-то должен её обслуживать. Мониторить актуальность названий.
    Вы серьезно?
     
  21. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    Уж точно не программист будет отвечать за реальность данных ))) Наша задача создать надежную и заслуживающую доверия систему управления данными. Что объявить устаревшим - дело штатных работников заказчика.

    А я офигеваю от утверждений типа "там точно что-то потеряется, поэтому давай разрешим показывать null". Это неприемлемый вариант.
     
  22. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.487
    Симпатии:
    281
    Так и я о том же.
    Устанавливаем значения по умолчанию, модель отвязываем от марки - ничего не потеряется, ничего не нужно мониторить.
    Конкретно для этого случая, идеальный вариант.