Бьюсь с этим весь вечер. Преподаватель задаёт много, объсняет мало. Надо создать запрос, где нужно выбрать всех мастеров женского зала с услугами со скидкой, показать всё. То бишь нужно соединить в один запрос Сервис из Сервиса, Дисконт из Прайса, МастерНейм из Мастера и Холл из Интерьера, как это делать я даже не представляю. Сколько не билась, вечно вылезает какая-нибудь ошибка, поэтому идеи уже закончились.. .
последняя моя попытка получилась, если так можно сказать успешной --->
SELECT
Master.MasterName, Price.Discount, Interior.Hall, Service.Service
FROM
Service, Price, Master, Interior
WHERE
( Price.Discount NOT LIKE "*Нет*" AND Interior.Hall LIKE "*Женский зал*") ,
НО результатов у меня получилось больше 100 тысяч, при условии что всего кортежей у меня 1000, то есть буквально, строки дублируются раз по 200 каждая, и я не могу понять почему? Нужно какое-то ограничение? Но какое?? Подскажите пожалуйста, мозг уже просто выкипает.. .
и если можно, не пишите всяких офигенно заумных пограммерских слов, я в этом полный нуб и вряд ли пойму о чём речь =))))
Заранее просто НАИОГРОМЕДНЕЙШЕЕ СПАСИБО, откликнувшимся)))
Другие языки программирования и технологии
помогите создать запрос в SQL!
Дело в том, что выбор из двух таблиц без условия связи этих таблиц приводит к тому, что каждая запись первой таблицы сочетается с каждой записью второй таблицы. Вот и получаются те сотни тысяч результатов. И, конечно же, никакой LIMIT тут не поможет.
Другими словами, без условия связи выводится таблица, в которой каждому сервису поставлен в соответствие каждый мастер. А ведь нужен только тот мастер, который указан для этого сервиса. Поэтому в обязательном порядке должны быть условия типа Service.Service_MasterFK = Master.MasterID.
В принципе не важно, где эти условия указывать: в JOIN или непосредственно в WHERE. Вот только LEFT JOIN тут не подходит, надо использовать INNER JOIN, ведь если у сервиса нет, например, мастера, то и не нужен нам такой сервис. (Даже если такая ситуация и невозможна из-за ограничений в таблицах, всё равно стоит сразу же приучаться использовать правильный тип JOIN.)
Ну а если с JOIN не хочется связываться, то запрос может выглядеть так (обрати внимание на таблицу SPA: она необходима для связи между Service и Interior):
SELECT DISTINCT
Master.MasterName, Price.Discount, Interior.Hall, Service.Service
FROM
Service, Price, Master, SPA, Interior
WHERE
(Service.Service_PriceFK = Price.PriceID AND Service.Service_MasterFK = Master.MasterID AND Service.ServiceID = SPA.Spa_ServiceFK AND SPA.SPA_InteriorFK = Interior.InteriorID AND Price.Discount NOT LIKE "*Нет*" AND Interior.Hall LIKE "*Женский зал*")
Параметр DISTINCT необходим на тот случай, если одна и та же услуга оказывается в одном и том же зале несколько раз (например, в среду и пятницу) , судя по схеме данных, такая ситуация возможна.
Другими словами, без условия связи выводится таблица, в которой каждому сервису поставлен в соответствие каждый мастер. А ведь нужен только тот мастер, который указан для этого сервиса. Поэтому в обязательном порядке должны быть условия типа Service.Service_MasterFK = Master.MasterID.
В принципе не важно, где эти условия указывать: в JOIN или непосредственно в WHERE. Вот только LEFT JOIN тут не подходит, надо использовать INNER JOIN, ведь если у сервиса нет, например, мастера, то и не нужен нам такой сервис. (Даже если такая ситуация и невозможна из-за ограничений в таблицах, всё равно стоит сразу же приучаться использовать правильный тип JOIN.)
Ну а если с JOIN не хочется связываться, то запрос может выглядеть так (обрати внимание на таблицу SPA: она необходима для связи между Service и Interior):
SELECT DISTINCT
Master.MasterName, Price.Discount, Interior.Hall, Service.Service
FROM
Service, Price, Master, SPA, Interior
WHERE
(Service.Service_PriceFK = Price.PriceID AND Service.Service_MasterFK = Master.MasterID AND Service.ServiceID = SPA.Spa_ServiceFK AND SPA.SPA_InteriorFK = Interior.InteriorID AND Price.Discount NOT LIKE "*Нет*" AND Interior.Hall LIKE "*Женский зал*")
Параметр DISTINCT необходим на тот случай, если одна и та же услуга оказывается в одном и том же зале несколько раз (например, в среду и пятницу) , судя по схеме данных, такая ситуация возможна.
SELECT
Master.MasterName, Price.Discount, Interior.Hall, Service.Service
FROM
Master LEFT JOIN Service ON Master.Id=Service.Master LEFT JOIN Price ON Price.Service=Service.Id LEFT JOIN Interior ON Interior.Service=Price.Id
Service, Price, Master, Interior
WHERE
( Price.Discount NOT LIKE "*Нет*" AND Interior.Hall LIKE "*Женский зал*")
Это я подразумеваю, что у тебя во всех таблицах есть поле Id, определяющее ключ записи, и таблицы ссылаются друг на друга (Master -> Service -> Price -> Interior). То есть: мастер оказывает услугу, которой заданы цена и скидки, которые могут быть разными для разных залов.
В кратце же, это задание на LEFT JOIN. А у тебя запрос - выбрать все записи во всех возможных сочетаниях. Вот SQL и старался... .
P.S. В Access (а картинка твоя оттуда, да? ) есть ОЧЕНЬ простой построитель запросов. Используй его, всё будет не сложно.
Master.MasterName, Price.Discount, Interior.Hall, Service.Service
FROM
Master LEFT JOIN Service ON Master.Id=Service.Master LEFT JOIN Price ON Price.Service=Service.Id LEFT JOIN Interior ON Interior.Service=Price.Id
Service, Price, Master, Interior
WHERE
( Price.Discount NOT LIKE "*Нет*" AND Interior.Hall LIKE "*Женский зал*")
Это я подразумеваю, что у тебя во всех таблицах есть поле Id, определяющее ключ записи, и таблицы ссылаются друг на друга (Master -> Service -> Price -> Interior). То есть: мастер оказывает услугу, которой заданы цена и скидки, которые могут быть разными для разных залов.
В кратце же, это задание на LEFT JOIN. А у тебя запрос - выбрать все записи во всех возможных сочетаниях. Вот SQL и старался... .
P.S. В Access (а картинка твоя оттуда, да? ) есть ОЧЕНЬ простой построитель запросов. Используй его, всё будет не сложно.
хаха :)
=> и если можно, не пишите всяких офигенно заумных пограммерских слов
Нет так не честно. Как так! ? Игра не по правилам
=> НО результатов у меня получилось больше 100 тысяч,
Для этого есть оператор LIMIT который ограничивает количество возращаемых строк (ставится в конце выражения)
=> то есть буквально, строки дублируются раз по 200 каждая,
И кстати для этого тоже есть оператор DISTINCT - означает что нужно выбрать только те строки содержание КОТОРЫХ НЕ ПОВТОРЯЕТСЯ
короче,
запрос будет выглядеть вот так:
SELECT DISTINCT
Master.MasterName, Price.Discount, Interior.Hall, Service.Service
FROM
Service, Price, Master, Interior
WHERE
( Price.Discount NOT LIKE "*Нет*" AND Interior.Hall LIKE "*Женский зал*") LIMIT 20
LIMIT 20 - значит вернет ровно 20 строк, напишите 5 вместо 20 - вернет 5 строк, то есть подставьте вместо 20 кол-во строк которые хотите получить в ответ.
Старайтесь избегать JOIN'ов когда таблица очень большая. Это создает нагрузку нагрузку на сервер и СУБД сканирует всю таблицу - что само по себе не очень хорошо.
Натуральные JOIN'ы предназначены для получение ОДНОГО результата с нескольких таблиц за один раз.
И кстати, на W3Schools есть ооочень ооочень очееень отличное введение в SQL где все очень просто расписано со всеми примерами и обьяснениями.
=> и если можно, не пишите всяких офигенно заумных пограммерских слов
Нет так не честно. Как так! ? Игра не по правилам
=> НО результатов у меня получилось больше 100 тысяч,
Для этого есть оператор LIMIT который ограничивает количество возращаемых строк (ставится в конце выражения)
=> то есть буквально, строки дублируются раз по 200 каждая,
И кстати для этого тоже есть оператор DISTINCT - означает что нужно выбрать только те строки содержание КОТОРЫХ НЕ ПОВТОРЯЕТСЯ
короче,
запрос будет выглядеть вот так:
SELECT DISTINCT
Master.MasterName, Price.Discount, Interior.Hall, Service.Service
FROM
Service, Price, Master, Interior
WHERE
( Price.Discount NOT LIKE "*Нет*" AND Interior.Hall LIKE "*Женский зал*") LIMIT 20
LIMIT 20 - значит вернет ровно 20 строк, напишите 5 вместо 20 - вернет 5 строк, то есть подставьте вместо 20 кол-во строк которые хотите получить в ответ.
Старайтесь избегать JOIN'ов когда таблица очень большая. Это создает нагрузку нагрузку на сервер и СУБД сканирует всю таблицу - что само по себе не очень хорошо.
Натуральные JOIN'ы предназначены для получение ОДНОГО результата с нескольких таблиц за один раз.
И кстати, на W3Schools есть ооочень ооочень очееень отличное введение в SQL где все очень просто расписано со всеми примерами и обьяснениями.
Похожие вопросы
- Помогите создать запрос на SQL
- Пожалуйста помогите с запросами на SQL
- Люди, знающие SQL, помогите сделать запрос.
- Помогите создать резервную копию ОС
- люди помогите создать онлайн игру
- Помогите создать базу данных
- Пожалуйста, помогите создать сайт!
- Assembler помогите создать файлы *.obj *.exe
- Помогите создать батник для отправки файла на ftp
- Помогите создать эмблему!!! Пожалуйста!!!