Другие языки программирования и технологии

помогите создать запрос в SQL!

Бьюсь с этим весь вечер. Преподаватель задаёт много, объсняет мало. Надо создать запрос, где нужно выбрать всех мастеров женского зала с услугами со скидкой, показать всё. То бишь нужно соединить в один запрос Сервис из Сервиса, Дисконт из Прайса, МастерНейм из Мастера и Холл из Интерьера, как это делать я даже не представляю. Сколько не билась, вечно вылезает какая-нибудь ошибка, поэтому идеи уже закончились.. .
последняя моя попытка получилась, если так можно сказать успешной --->
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 каждая, и я не могу понять почему? Нужно какое-то ограничение? Но какое?? Подскажите пожалуйста, мозг уже просто выкипает.. .
и если можно, не пишите всяких офигенно заумных пограммерских слов, я в этом полный нуб и вряд ли пойму о чём речь =))))

Заранее просто НАИОГРОМЕДНЕЙШЕЕ СПАСИБО, откликнувшимся)))
Дело в том, что выбор из двух таблиц без условия связи этих таблиц приводит к тому, что каждая запись первой таблицы сочетается с каждой записью второй таблицы. Вот и получаются те сотни тысяч результатов. И, конечно же, никакой 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 необходим на тот случай, если одна и та же услуга оказывается в одном и том же зале несколько раз (например, в среду и пятницу) , судя по схеме данных, такая ситуация возможна.
СС
Солныш Суслопаров
11 998
Лучший ответ
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 (а картинка твоя оттуда, да? ) есть ОЧЕНЬ простой построитель запросов. Используй его, всё будет не сложно.
VP
Vladimir Paveliev
8 890
хаха :)

=> и если можно, не пишите всяких офигенно заумных пограммерских слов
Нет так не честно. Как так! ? Игра не по правилам

=> НО результатов у меня получилось больше 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 где все очень просто расписано со всеми примерами и обьяснениями.
Андрей Сажин
Андрей Сажин
4 333