@Arthaus25

Выборка из двух таблиц с учётом иных связей?

Есть вот такая БД
5fe621ac88cbe659610637.png

Как написать запрос, чтобы на выдачу получить такие колонки:
Grands_Prix.Round
Grands_Prix.Title
Grands_Prix.Country
Grands_Prix_Racers.Position
Racers.Name
Teams.Title

Если мне нужно, чтобы выдача была исключительно по одной команде? Это или Teams.Title, или Teams.id (или Racers_Teams_Seasons.Teams_Id?)

Вот такой запрос выдаёт очень странный результат: выводит каждую гонку любого гонщика, при этом выдаёт разные позиции на одну и ту же гонку, но всем исправно пишет одну и ту же команду, что неправда.
SELECT Grands_Prix.Round,
		Grands_Prix.Title,
		Grands_Prix.Country,
		Grands_Prix_Racers.Position,
		Racers.Name,
		Teams.Title,
		Teams.Id
FROM Grands_Prix, Grands_Prix_Racers, Racers, Teams
WHERE Teams.id = 6


На скрине ответа на запрос это не видно, но обратите внимание, что строк в ответе 693 120.

Всего в команде два гонщика, 38 гонок, значит, результатов по логике должно быть 76.

5fe624adc02d5099549645.png
  • Вопрос задан
  • 39 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Arthaus25 Автор вопроса
В конечном итоге я запрос создал таким и он работает. Прошу прощения за глупые комменты, писал сам для себя.
SELECT
	-- Берём Раунд (какое Гран-При по счёту), Автодром, Страну и Где автодром находится, Гонщика, \
	-- его Финальную позицию и Команду
	E.Round, E.Circuit, E.Country, E.Location, F.Name, F.Position, F.Title 
FROM 
	Grands_Prix as E -- ЭТО ТАБЛИЦА Е!
-- Джойним (справа, по id Гран-При) таблицу Гран-при и F
RIGHT OUTER JOIN 
	(
	SELECT
		-- Берём id гонки (Гран-При), позицию пилота на финише, его имя и название команды
		C.Grands_Prix_Id, C.Position, D.Name, D.Title 
	-- Джойним (справа, по id пилотов) таблицу связи Гран-При--пилотов \
	-- с таблицей А (см. то, что в RIGHT OUTER JOIN)
	FROM
		Grands_Prix_Racers as C -- ЭТО ТАБЛИЦА С!
	RIGHT OUTER JOIN
		(
			SELECT 
				-- Берём id пилота, его имя и название команды
				A.Id, A.Name, B.Title 
			FROM 
				(
				SELECT	
					-- Берём id пилота, его имя, id команды, сезон 
					Racers.Id, Racers.Name, Racers_Teams_Seasons.Teams_Id, Racers_Teams_Seasons.Seasons_Year 
				-- Джойним (справа, по id команд) таблицы гонщиков и таблицу связей гонщиков-коман-сезонов 
				FROM 
					Racers
				RIGHT OUTER JOIN 
					Racers_Teams_Seasons
				ON 
					Racers.Id = Racers_Teams_Seasons.Racer_Id
				WHERE
					-- по условию, сезон — 2020, Команда по id — 3 (Racing Point)
					(Seasons_Year = 2020) AND (Teams_Id = 3) 
				) as A -- В СКОБКАХ — ЭТО ТАБЛИЦА А!

			LEFT OUTER JOIN
				Teams as B -- ЭТО ТАБЛИЦА В!
			ON
				A.Teams_Id = B.Id 
		) as D -- ЭТО ТАБЛИЦА D!
	ON
		C.Racers_Id = D.Id
	WHERE
		-- Берём Гран-При с id выше 21 \
		-- В 2019 году было 21 Гран-При, следовательно, \
		-- так берём все ГП 2020 года 
		-- [Я знаю, это косяк архитектуры. \
		-- На будущее — перестать запрещать изменения в любых таблицах!])
		C.Grands_Prix_Id > 21  
							   
	) as F -- ЭТО ТАБЛИЦА F!
ON
	E.Id = F.Grands_Prix_Id
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы