На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Akina
  
> Один запрос для выборки из двух таблиц
    Добрый день!
    Хотел сделать выборку из двух разных таблиц, но используя для этого только лишь один запрос. Написал вот такой:
    ExpandedWrap disabled
      SELECT brands.brand_name, models.model_name
      FROM brands, models WHERE brands.brand_id='1' AND models.model_id='5' LIMIT 1


    Вот хотел посоветоваться со знатоками, правильно ли это, или же есть более красивый, и правильный способ получить желаемое? Спасибо.
    Сообщение отредактировано: Bas -
      Ну если результат тот что надо, то норм.
        Цитата domencom @


        Да, результат тот что надо. Спасибо.
          Цитата iPhonesoft @
          Вот хотел посоветоваться со знатоками, правильно ли это, или же есть более красивый, и правильный способ получить желаемое? Спасибо.

          В данном запросе "закопана" некая бомба замедленного действия, потому что явно не указано как связаны brands, models. В результате сначала строится декартов произведение всех записей из обоих таблиц, потом производится отбор по критериям и из оставшегося берется верхняя запись
          Возможное в будущем грабли:
          1. тормоза
          2. разный, непредсказуемый результат
          Как лечить
          1. добавить джойн таблиц
          2. прописать в явном виде сортировку
            iPhonesoft
            какая БД и как связаны таблиц?
            LIMIT 1 А вот это всегда нехороший костыль
              Цитата Павел Калугин @
              сначала строится декартов произведение всех записей из обоих таблиц, потом производится отбор по критериям

              Ну это разве что в ОЧЕНЬ древней версии какой-нить СУБД...

              Цитата vladimir74 @
              LIMIT 1 А вот это всегда нехороший костыль

              Есть подозрения, что brands.brand_id и models.model_id - первичные ключи таблиц. Тогда пофиг.
                Цитата Akina @
                Ну это разве что в ОЧЕНЬ древней версии какой-нить СУБД...

                а что будет в современной СУБД в результате запроса
                ExpandedWrap disabled
                  SELECT brands.brand_name, models.model_name FROM brands, models


                хотя если подозрение про ключи верно.. Тогда странным выглядит LIMIT 1 ;)
                Сообщение отредактировано: Павел Калугин -
                  Спасибо большое всем ответившим на мой вопрос. Хочу уточнить:

                  1) БД MySQL версия 5.5.42
                  2) Таблицы brands и models никак между собой не связаны
                  3) brand_id и model_id - первичные ключи таблиц
                  4) Использовал LIMIT 1 т.к. в результате запроса всегда возвращается только лишь одна запись. Поэтому посчитал логичным указать LIMIT 1
                  5) Для чего это мне нужно? Хотел построить навигационную цепочку (Breadcrumb) на сайте. Например: Smartphones -> Apple -> iPhone 5s

                  Еще раз спасибо огромное всем за помощь.
                    Цитата Павел Калугин @
                    что будет в современной СУБД в результате запроса

                    Отбор по условиям для одной таблицы будет выполнен ещё до связывания. Гарантированно - при наличии подходящего для этого условия индекса с высокой селективностью, и с достаточно высокой вероятностью - при его отсутствии.

                    Добавлено
                    Цитата iPhonesoft @
                    Использовал LIMIT 1 т.к. в результате запроса всегда возвращается только лишь одна запись. Поэтому посчитал логичным указать LIMIT 1

                    В данном случае - бессмысленно, указание лишнее. А вот не будь индексов - в LIMIT был бы смысл, он бы дал принудительное завершение сканирования после нахождения записи.
                      Цитата Akina @
                      В данном случае - бессмысленно, указание лишнее. А вот не будь индексов - в LIMIT был бы смысл, он бы дал принудительное завершение сканирования после нахождения записи.


                      Спасибо большое за разъяснение, теперь буду знать.
                        Цитата Akina @
                        не будь индексов

                        Я имел в виду то, что после пре-джойн отбора и последующего объединения остаётся ОДНА запись - т.е. что поля отбора unique.
                          Если не много подкорректировать, то будет вполне достойно
                            Цитата iPhonesoft @
                            Таблицы brands и models никак между собой не связаны

                            Цитата iPhonesoft @
                            Хотел сделать выборку из двух разных таблиц,

                            Цитата iPhonesoft @
                            WHERE brands.brand_id='1' AND
                            models.model_id='5'


                            Цитата iPhonesoft @
                            Да, результат тот что надо.

                            Естественно что результат предсказуем.
                            С таким же успехом можно добится соответствия
                            Ракета -> Tesla -> Запорожец
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0680 ]   [ 16 queries used ]   [ Generated: 29.03.24, 05:48 GMT ]