2015-02-12 3 views
0

У меня есть 4 таблицы:SQLQuery COUNT количество игр в команде

Команды

codTeam: 1 
year: 1995 
codYears: 1 
codType: 1 
name: FCP 
points: 3 

codTeam: 2 
year: 1990 
codYears: 1 
codType: 1 
name: SLB 
points: 3 

codTeam: 3 
year: 1995 
codYears: 3 
codType: 2 
name: BCP 
points: 0 

Тренеры(Люди, которые тренируются команды)

codTrainer: 1 
name: Peter 
street: Ghost street 
cellphone: 252666337 
birthdayDate: 1995-02-01 
BI: 11111111 
number: 121212121 

codTrainer: 1 
name: Pan 
street: Ghost street Remade 
cellphone: 253999666 
birthdayDate: 1995-01-01 
BI: 22222222 
number: 212121212 

TeamsTrainers(В какой команде кто-то обучение)

codTeamTrainer: 1 
codTeam: 1 
codTrainer: 2 
dataInicio: 1998-05-05 

codTeamTrainer: 2 
codTeam: 2 
codTrainer: 2 
dataInicio: 1998-06-07 

codTeamTrainer: 3 
codTeam: 2 
codTrainer: 1 
dataInicio: 1999-09-09 

Игры

codGame: 1 
date: 2015-02-12 13:00:00 
codTeamHome: 1 
codTeamAgainst: 2 
goalsHome: 3 
goalsAgainst: 2 
codTypeGame: 1 

codGame: 2 
date: 2015-02-12 15:00:00 
codTeamHome: 2 
codTeamAgainst: 1 
goalsHome: 1 
goalsAgainst: 2 
codTypeGame: 3 

Поэтому в основном я хочу:

Получите настольные игры и шоу:

Название команды | Имя тренера | Голы Главная | Голы против | Очки | Ammout игр от дома Team

У меня есть следующий код, который в SQLQuery:

SELECT Teams.name, Trainers.name, Games.goalsHome, 
     Games.goalsAgainst, Teams.points, COUNT(*) 
FROM Teams, Trainers, Games, TeamsTrainers 
WHERE Games.codTeamHome = Teams.codTeam AND 
     TeamsTrainers.codTeam = Teams.codTeam AND 
     TeamsTrainers.codTrainer = Trainers.codTrainer 
GROUP BY Teams.name, Trainers.name, Games.goalsHome, 
     Games.goalsAgainst, Teams.points 

(может иметь некоторые ошибки, как я перевел)

Тем не менее, COUNT показывает только 1 (Вероятно потому что на ГДЕ он имеет «teamHome», поэтому он считается только 1), но если это из-за этого, как мне его исправить?

Результат:

FCP | Pan | 3 | 2 | 3 | 1 (Count) 
SLB | Peter | 1 | 2 | 3 | 1 (Count) 
SLB | Pan | 1 | 2 | 3 | 1 (Count) 

Это должно быть 2 для каждого из них на графа

Любая идея?

+0

Что база данных: SQL Server, PostgreSQL, MySQL? –

+0

Студия управления SQL Server – Ran

ответ

1

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

См: http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

EDIT

SELECT Te.name, Tr.name, Ga.goalsHome, Ga.goalsAgainst, Te.points, 
     (SELECT COUNT(*) 
     FROM Games 
     WHERE codTeamHome = Te.codTeam OR codTeamAgainst = Te.codTeam) 
     AS CountOfGames 
FROM TeamsTrainers AS Tt 
    LEFT JOIN Teams AS Te ON Tt.codTeam = Te.codTeam 
    LEFT JOIN Trainers AS Tr ON Tt.codTrainer = Tr.codTrainer 
    LEFT JOIN Games AS Ga ON Ga.codTeamHome = Te.codTeam 

SQL Fiddle

+0

Не понимаю, как его использовать – Ran

+0

Какая часть? Что вы хотите сосчитать? –

+0

Общее количество игр в команде. (В этом случае они оба играют дважды, поэтому счет должен быть 2, а не 1) – Ran

0

Вы можете изменить свой ИНЕКЕ говоря

[what you have] OR (Games.codTeamAgainst = Teams.codTeam AND ...) 

Однако, это, вероятно, вызывает другие проблемы, потому что вы, вероятно, волнует ли конкретная команда оценки этих целей, не является ли оценки хозяев поля голов в играх, команда играет с обеих сторон.

Возможно, вы не заметите других проблем какое-то время, потому что предложение GROUP BY, вероятно, довольно далекое от того, что вы хотите, и вы можете захотеть выбирать агрегатные функции для более простой группировки.

+0

Это только спам еще больше игр и не изменило счет. :/ – Ran

+0

@Ran: Вы понимаете, что делает это условие GROUP BY? См. Http://stackoverflow.com/questions/2421388/using-group-by-on-multiple-columns. Как я указал в своем ответе, вы, вероятно, занимаете слишком много групп. Вы только объединяете игры с одинаковым счетом, поэтому вы не группируете игру, где домашняя команда выиграла 3-2 с игрой, где хозяева проиграли 1-2. Вот почему вы получаете счет 1 игры со счетом 3-2. –

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