Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.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 |
Цитата Павел Калугин @ сначала строится декартов произведение всех записей из обоих таблиц, потом производится отбор по критериям Ну это разве что в ОЧЕНЬ древней версии какой-нить СУБД... Есть подозрения, что brands.brand_id и models.model_id - первичные ключи таблиц. Тогда пофиг. |
Автор: Павел Калугин 21.03.16, 13:21 |
а что будет в современной СУБД в результате запроса <{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 |
Я имел в виду то, что после пре-джойн отбора и последующего объединения остаётся ОДНА запись - т.е. что поля отбора unique. |
Автор: roilix 15.12.16, 14:54 |
Если не много подкорректировать, то будет вполне достойно |
Автор: Bas 16.12.16, 07:15 |
Естественно что результат предсказуем. С таким же успехом можно добится соответствия Ракета -> Tesla -> Запорожец |