2012-10-08 2 views
0

У меня есть таблица статистики защитника. Каждая строка в таблице представляет одну производительность QB в одной игре. Уникальный идентификатор для каждой строки называется gameId и состоит из ID игрока и даты игры.SQL select с одним пунктом, подчиненным другому

Что я хочу сделать, это использовать оператор select для создания списка всех уникальных защитников в таблице, которые выбрали хотя бы одно завершение.

Я пытаюсь сделать это с этим утверждением:

SELECT * FROM swdata 
WHERE gameComp > 0 AND gameId IN (
    SELECT MAX(gameId) FROM swdata GROUP BY playerId) 
ORDER BY playerLastName 

Первый пункт является gameComp> 0, а второе условие состоит в веять список до уникальных защитников.

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

Но на самом деле происходит то, что они запускаются одновременно, и это приводит к тому, что некоторые игроки опускаются из результатов.

Итак, я знаю, что я неправильно это сделал. Может ли кто-нибудь помочь мне исправить это?

+0

Ваш запрос ищет игроков, которые бросили хотя бы одно завершение в своей последней игре. –

+0

Точно. Итак, как я могу структурировать его, чтобы выбрать уникальных защитников, которые выбрали хотя бы одно завершение? – Kirkman14

+1

Как предложил Гордон Линофф. Если у вас есть имя игрока в таблице SWdata, ваши данные плохо нормализованы. Имя игрока должно быть в таблице, которая определяет идентификатор игрока; таблица swdata должна содержать только идентификатор игрока. 'SELECT DISTINCT a, b, c FROM Wherever' означает, что будут выбраны только уникальные комбинации' a, b, c'; DISTINCT применяется ко всем столбцам в списке выбора, а не только к ведущему столбцу. –

ответ

2

Если вы хотите уникальные идентификаторы игроков, не работает ли следующая работа?

select distinct playerId 
from swdata 
where gamecomp > 0 

Если вы хотите больше, чем один столбец, а затем присоединиться обратно к исходной таблице, с помощью запроса, такие как:

select s.* 
from swdata s join 
    (select playerId, max(gameId) as maxgameId 
     from swdata 
     group by playerId 
    ) m 
    on s.gameId = maxgameId 

Это в ответ на ваш вопрос о distinct. Различный возвращает различные значения всего в предложении select. Таким образом, следующие условия эквивалентны:

select distinct playerID, playerLastName, playerFirstName 
from swdata 

и

select playerID, playerLastName, playerFirstName 
from swdata 
group by playerID, playerLastName, playerFirstName 

Оба они возвращают все уникальные комбинации из трех колонок, которые появляются в данных.

+0

Это очень близко к тому, что я хочу. Но я хочу больше, чем просто одну колонку. Мне также понравится имя игрока и еще пара вещей. Есть ли способ получить это с использованием отдельного ключевого слова? – Kirkman14

+0

Я не понимаю второй запрос, который вы опубликовали. Но первый кажется очень близким. Кажется, что это то, что я хочу: SELECT DISTINCT playerId, playerFirstName, playerLastName FROM swdata WHERE gamecomp> 0 ЗАКАЗ BY playerLastName – Kirkman14

+0

@ Kirkman14. , , О, это, вероятно, тоже будет работать. Вы не указали, какие поля вы хотите, поэтому второй запрос возвращает все поля из одной из записей в swdata. Ваш отчет будет работать, если игрок не изменит имена. –

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