2009-11-07 4 views
1

Я работаю над страницей ранжирования для игры, и я хочу заказать ранжирование сначала победами, а затем убытками (в случае, если люди имеют одинаковое количество побед) , Следующий запрос работает отлично, чтобы сделать список по порядку, но я не уверен, как поместить потери в этот запрос.Выберите 2 COUNT() из запроса MySQL

SELECT username, COUNT(id) AS wins 
    FROM tblBattleHistory 
    WHERE battle_type = '0' && outcome = '1' 
    GROUP BY username 
    ORDER BY wins DESC 

результат = '1' означает, что они выиграли, поэтому, когда результат = '0', значит, они потеряли.

ответ

8

Вы можете сделать это следующим образом:

SELECT username, SUM(outcome) AS wins, COUNT(*) - SUM(outcome) AS losses 
    FROM tblBattleHistory 
    WHERE battle_type = '0' 
    GROUP BY username 
    ORDER BY wins DESC, losses 
+0

Похоже, это должно сработать. +1 –

+0

Есть ли связи? –

+1

Это не работает, если есть связи. – Thorsten

0

Я не знаю, что мой ответ явно не то, что вы просили, но ... я думаю, вместо того, чтобы получать счета от tblBattleHistory, вы должны добавить 2 файла к вам. Таблица пользователей (выигрывает, терпит неудачу) и обновлять их (возможно, через триггер insert на tblBattleHistory), поэтому у вас есть все данные, доступные с помощью простого выбора.

+2

Это будет считаться избыточным и нормализованным. Не денормализовать, если у вас нет проблем с производительностью! –

+0

Если вы хотите упростить это с помощью «простого» SELECT, тогда настройте представление и сделайте свой простой выбор, чтобы ... Нет необходимости в f ** k до проектирования БД просто для того, чтобы иметь простые запросы. Вы знаете, что такое мнение, верно? –

+0

На самом деле это не избыточность и не денормализация. это просто прямой дизайн домена. Пользователь и пользователь имеет коэффициент выигрыша/потеря. это абсолютно не о производительности. --- , как для зрения - точка зрения вы предлагаете является прямым результатом дизайна Тупой модели предметной области (нет необходимости говорить, что эти модели сопоставляются немой структура БД) има, конечно :) – COTOHA

0
SELECT username, losses, wins 
FROM (
    SELECT username, COUNT(id) AS wins 
    FROM tblBattleHistory 
    WHERE battle_type = '0' && outcome = '1' 
    GROUP BY username 
) A 
LEFT JOIN (
    SELECT username, COUNT(id) as losses 
    FROM tblBattleHistory 
    WHERE battle_type = '0' && outcome = '0' 
) B ON A.username = B.username 
ORDER BY wins DESC, losses ASC 

Это не может быть эффективным запрос, но делает работу.

4

Вот моя идея:

SELECT username, SUM (CASE WHEN outcome = '1' Then 1 Else 0 End) As Wins, 
    SUM (CASE WHEN outcome = '0' Then 1 Else 0 End) As Losses 
FROM tblBattleHistory 
WHERE battle_type = '0' 
GROUP BY username 
ORDER BY wins DESC, Losses ASC 

(. В зависимости от СУБД, возможно, придется повторить СУММ в Order By, а не использовать псевдонимы)

Это также позволяет придумать некоторые незнакомец указывает схемы, например, для немецкого футбола (победа = 3, связь = 1 точка)

SELECT username, SUM (CASE 
    WHEN outcome = '1' Then 3 
    WHEN outcome = '2' Then 1 /* 2 is a tie */ 
    ELSE 0 End) As Points 
etc. 
1

Это может также работать:

SELECT 
    username, 
    SUM(IF(outcome = 1, 1, 0)) AS 'wins', 
    SUM(IF(outcome = 0, 1, 0)) AS 'losses' 
FROM 
    tblBattleHistory; 

Это, в основном, счетчики outcome = 1 и outcome = 0.