2014-04-12 3 views
1

У меня вопрос о вложенных/подзапросах, которые прослушивали меня какое-то время.Вложенные запросы - есть ли более умный способ

Я программирую игру на php. В очень простой версии моей системы я следующие 3 таблицы:

игроков (каждый игрок имеет только один вход):

| player_id | player_name | 

статистика (каждый игрок имеет одну запись для каждой игры он находится в) :

| stat_id | player_id | game_id | outcome | 

игры (каждые игры имеют один вход):

| game_id | game_name | 

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

| player_name | count stats for player where outcome = 1 || count stats for player where outcome = 2 | 

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

select a.player_name, 
    (select count(*) from stats b where b.player_id = a.player_id AND b.outcome = 1) as number_of_games1, 
    (select count(*) from stats b where b.player_id = a.player_id AND b.outcome = 2) as number_of_games2 
from players a 

Я хотел бы также, чтобы иметь возможность использовать «number_of_games1» или «number_of_games2» во внешнем где, но выше подход не позволяет это:

select a.player_name, 
    (select count(*) from stats b where b.player_id = a.player_id AND b.outcome = 1) as number_of_games1, 
    (select count(*) from stats b where b.player_id = a.player_id AND b.outcome = 2) as number_of_games2 
from players a where number_of_games > 5 

что такое умный способ делать то, что я хочу сделать?

Спасибо.

ответ

0

Вы можете использовать SUM() функции с условием и использовать соединение, используя SUM() с условием приведет к булевым 1 или 0, так что вы можете рассчитывать желаемые результаты для b.outcome = 1 и b.outcome = 2

SELECT 
a.player_id, 
a.player_name, 
SUM(b.outcome = 1) as number_of_games1, 
SUM(b.outcome = 2) as number_of_games2 
FROM players a 
LEFT JOIN stats b ON(b.player_id = a.player_id) 
GROUP BY a.player_id 
HAVING number_of_games1 > 5 
/* you can add second condition for number_of_games2 
starting with any conditional operator 
*/ 
+0

Отлично работает отлично. Но можно ли заказать номер number_of_games1 + number_of_games2? – user3526228

+0

@ user3526228 да, вы можете после использования 'HAVING' использовать' ORDER BY number_of_games1 + number_of_games2' –

+0

Ну, я думал, что попробовал это, но я ошибся, потому что теперь он работает. Еще раз спасибо за помощь! – user3526228

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