Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Базы данных: SQL > Один запрос для выборки из двух таблиц


Автор: iPhonesoft 18.03.16, 19:29
Добрый день!
Хотел сделать выборку из двух разных таблиц, но используя для этого только лишь один запрос. Написал вот такой:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    SELECT brands.brand_name, models.model_name
    FROM brands, models WHERE brands.brand_id='1' AND models.model_id='5' LIMIT 1


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

Автор: domencom 18.03.16, 20:28
Ну если результат тот что надо, то норм.

Автор: iPhonesoft 19.03.16, 06:26
Цитата domencom @


Да, результат тот что надо. Спасибо.

Автор: Павел Калугин 21.03.16, 10:03
Цитата iPhonesoft @
Вот хотел посоветоваться со знатоками, правильно ли это, или же есть более красивый, и правильный способ получить желаемое? Спасибо.

В данном запросе "закопана" некая бомба замедленного действия, потому что явно не указано как связаны brands, models. В результате сначала строится декартов произведение всех записей из обоих таблиц, потом производится отбор по критериям и из оставшегося берется верхняя запись
Возможное в будущем грабли:
1. тормоза
2. разный, непредсказуемый результат
Как лечить
1. добавить джойн таблиц
2. прописать в явном виде сортировку

Автор: vladimir74 21.03.16, 10:21
iPhonesoft
какая БД и как связаны таблиц?
LIMIT 1 А вот это всегда нехороший костыль

Автор: Akina 21.03.16, 13:15
Цитата Павел Калугин @
сначала строится декартов произведение всех записей из обоих таблиц, потом производится отбор по критериям

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

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

Есть подозрения, что brands.brand_id и models.model_id - первичные ключи таблиц. Тогда пофиг.

Автор: Павел Калугин 21.03.16, 13:21
Цитата Akina @
Ну это разве что в ОЧЕНЬ древней версии какой-нить СУБД...

а что будет в современной СУБД в результате запроса
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    SELECT brands.brand_name, models.model_name FROM brands, models


хотя если подозрение про ключи верно.. Тогда странным выглядит LIMIT 1 ;)

Автор: iPhonesoft 21.03.16, 14:22
Спасибо большое всем ответившим на мой вопрос. Хочу уточнить:

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

Еще раз спасибо огромное всем за помощь.

Автор: Akina 21.03.16, 15:11
Цитата Павел Калугин @
что будет в современной СУБД в результате запроса

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

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

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

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


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

Автор: Akina 22.03.16, 13:35
Цитата Akina @
не будь индексов

Я имел в виду то, что после пре-джойн отбора и последующего объединения остаётся ОДНА запись - т.е. что поля отбора unique.

Автор: roilix 15.12.16, 14:54
Если не много подкорректировать, то будет вполне достойно

Автор: Bas 16.12.16, 07:15
Цитата iPhonesoft @
Таблицы brands и models никак между собой не связаны

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

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


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

Естественно что результат предсказуем.
С таким же успехом можно добится соответствия
Ракета -> Tesla -> Запорожец

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)