2012-05-23 3 views
1

Я хочу создать хранимую процедуру, которая принимает имя и год команды и возвращает количество игроков в этой конкретной команде за этот конкретный год. Я работаю с MYSQL и перечислены ниже таблицы, которые я использую:Подсчет людей в команде с хранимой процедурой

Person  (personID, name, phone, email, year) 
Player  (personID, dateOfBirth, school) 
playerTeam (personID, teamID) 
Team  (teamID, teamName, ageGroup) 

До сих пор я пытался присоединиться к таблицам и couting в PersonId только там, где teamName и Person.year = входные параметры, но не дало никаких результатов. Есть идеи?

После подачи на этот вопрос, используя метод проб и ошибок, я был в состоянии получить эту работу, используя следующие операторы:

DELIMITER // 

CREATE PROCEDURE teamSize (IN team VARCHAR (30), IN YEAR INT) 
BEGIN 
      SELECT 
        COUNT(Person.personID) NumOfPlayers 
      FROM 
        Person AS p, 
        Player, 
        playerTeam, 
        Team 
      WHERE Person.personID = Player.personID 
        AND Player.personID = playerTeam.personID 
        AND Team.teamID = playerTeam.teamID 
        AND Team.teamName = team 
        AND Person.year = YEAR ; 
END // 

DELIMITER ; 

CALL teamSize('Pirates', 1991); 

есть в любом случае, чтобы упростить это с помощью объединений и т.д., как в момент его немного беспорядочный.

+0

Я думаю, что вам не нужно, чтобы объединить его с 'Player', так как вам не нужно' dateOfBirth' и 'School' игроков. –

+0

Использовать формат SQL Ansi-92 (например, мой ответ ниже), а не SQLAnsi-89. –

+0

да, но мне нужен год в Лице, потому что, например, кто-то, кто может быть тренером, возможно, был игроком в команде в прошлом, и для проведения сравнений мне нужна таблица соединения, доступ к которой я могу получить только через Player – batsta13

ответ

2

Я не уверен, если вы хотите, как это:

DELIMITER // 

CREATE PROCEDURE GetPlayerCount (
      IN oTeamName VARCHAR (50), 
      IN oYear INT 
) AS 
BEGIN 
      SELECT 
        COUNT(a.PersonID) NoOfPlayers 
      FROM 
        Person a 
        INNER JOIN PlayerTeam b 
           ON a.PersonID = b.PersonID 
        INNER JOIN Team c 
           ON b.TeamID = c.TeamID 
      WHERE b.TeamName = oTeamName 
        AND a.Year = oYear ; 
END // 

DELIMITER ; 

, но я думаю, что это хочу, чтобы вы хотите.

Использование:

CALL GetPlayerCount('TeamDog', 2012); 
+0

, но мне не нужно подключаться от человека к игроку, а не к игрокам, чем к команде. Могу ли я присоединиться к человеку прямо в команде. – batsta13

+1

вы все равно можете достичь результата, не присоединившись к игроку. –

+0

Я пробовал код, который вы поставили, но это не сработало, но я смог заставить его работать сам. Я вставил свой код в вопрос, так или иначе, чтобы сократить/очистить его с помощью соединений. – batsta13

Смежные вопросы