![]() |
Модераторы: skyboy |
![]() ![]() ![]() |
|
Siriel |
|
||||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 23.9.2008 Репутация: нет Всего: нет |
Доброго времени суток, проблема следующая: необходимо построить запрос следующей логики:
Допустим есть 3(может и больше таблиц) : 1) школьники; 2) Олимпиада по математике 3) Олимпиаба по физике. Требуется осуществить выборку информации о ученике + сколько раз он участвовал в олимпиадах по физике. Запрос примерно сдеующий
Данный запрос проходит, но в колонках a и b выводятся некорректные результаты (неправильное количество).
Такой запрос (отличается отсутствием выборки из таблицы олимпиада_по_физикеt) выводит в колонку b корректные значения. Подскажите пожалуйста, что делаю не так. Вероятно не правильно понимаю механику SQL... |
||||
|
|||||
tzirechnoy |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 2 Всего: 16 |
<quote> 2) Олимпиада по математике 3) Олимпиаба по физике.</quote>
4) Олимпиада по химии 5) Соревнование на приз директора школы по физкультуре 6) итоговая (годовая) контрольная по географии 7) Вчерашняя контрольная по физике 8) Переписывание вчерашней контрольной по физике... Архитектора — пороть. По сути — в аргумент count() начинающим лучшэ ставить *. Меньшэ сбивает с толку. Запрос свой попробуйте сначала без агрегатов (group by и count()), посмотрите на результат, посчитайте вручную. Чтобы проще было считать — сделайте это для одного конкретного ученика, как машына и будет считать для каждого из них. |
|||
|
||||
Siriel |
|
||||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 23.9.2008 Репутация: нет Всего: нет |
Архитектура не причем, хотел написать проще для понимания. Если внимательней прочитать первый пост, из него видно, что 2-й запрос работает корректно, то есть с работой операторов GROUP BY и COUNT знаком...
Таблицы могут (и есть) совершенно разными, или это может быть одна таблица из которой требуется выбрать n-наборов под разными условиями, например так: Таблицы: 1) Ученики; 2) Контрольные работы; Требуется выбрать количество пятерок и троек каждого ученика. Выборку вижу в следующем виде (id_ученика, кол-во_троек, колво_пятерок):
данный запрос выбирает следующие (некоректные данные) к примеру: id = 1 тройки = 6 пятерки = 6 а вот такой запрос выбирает корректные данные к тому же примеру:
id = 1 пятерки = 3 Почему так происходит, может кто-нить объяснить? Это сообщение отредактировал(а) Siriel - 4.2.2009, 14:17 |
||||
|
|||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 15 Всего: 260 |
положим, у нас для id = 1 три записи в таблице "контрольные" с оценкой "пятерка" и две записи с оценкой "тройка". в результате у тебя будет 1(запись из "ученики") * 2(запись из "контрольные работы" с оценкой "3") * 3(запись из "контрольные работы" с оценкой "5") = 6 записей, в которой каждая контрольная работа на "5" повторяется дважды, а с оценкой "3" - трижды. Это называется декартовым произведением и именно так и должен работать join. |
|||
|
||||
Zloxa |
|
||||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
-------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
||||
|
|||||
Siriel |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 23.9.2008 Репутация: нет Всего: нет |
Вот это то, - что нужно. Большое спасибо skyboy за объяснение в чем ошибка и Zloxa за правильную реализацию.
Вопрос решен. Это сообщение отредактировал(а) Siriel - 4.2.2009, 20:12 |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Составление SQL-запросов | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |