2013-04-07 2 views
1

Я получил это заявление (до сих пор) на конкурс сценарий:MYSQL - Количество раундов

SELECT COUNT(round) AS runden, COUNT(status) AS status FROM rounds AS r INNER JOIN player AS p ON r.playerID = p.id WHERE r.playerID = <ID>" 

Этой таблица сохраняет все сыгранные раунды по определенному пользователю. Если пользователь участвует в раунде, он будет записан в этой таблице:

ID = идентификатор
playerId = Id игрока
раунде = воспроизводимый круглого (от 1 до 4)
играл = Если пользователь проиграл = 1, если нет = 0
status = Если пользователь выиграл этот раунд = 1, если нет = 0

Теперь мне нужно значение всех сыгранных раундов по статусу = 1 или status = 0 Итак, мне нужны полные выигранные раунды и потерянные раунды.

Это показывает его:

function getRoundsByPlayer($playerId) { 
     $sql = " 
     SELECT COUNT(round) AS runden, COUNT(status) AS status FROM rounds AS r INNER JOIN player AS p ON r.playerID = p.id WHERE r.playerID = :playerId"; 
     try { 
      $db = self::getConnection(); 
      $stmt = $db->prepare($sql); 
      $stmt->bindParam("playerId", $playerId); 
      $stmt->execute(); 
      $player = $stmt->fetch(PDO::FETCH_LAZY); 
      $db = null; 
      return $player; 
     } catch(PDOException $e) { 
      echo $e->getMessage(); 
     } 
    } 

$runden = $helper->getRoundsByPlayer($row['id']); 

и HTML:

... 
<td><?php echo $runden->runden; ?></td> 
... 

Как реализовать его, не используя второе или третье утверждение SQL? Благодаря!

ответ

1

Если я вас правильно понял вы можете использовать условный подсчет, как этот

SELECT SUM(CASE WHEN r.status = 1 THEN 1 ELSE 0 END) AS won_rounds, 
     SUM(CASE WHEN r.status = 0 THEN 1 ELSE 0 END) AS lost_rounds 
    FROM rounds AS r INNER JOIN 
     player AS p ON r.playerID = p.id 
WHERE r.playerID = <ID> AND r.played = 1 
GROUP BY r.playerID 

Запрос не был проверен

+0

Работает! Спасибо! :) – Marek123

+0

Вы, безусловно, приветствуются: D Счастливое кодирование. – peterm

1

Используйте следующий SQL-оператор (не проверено):

SELECT SUM(played) AS played 
     SUM(status) AS status 
FROM rounds AS r 
INNER JOIN player AS p 
ON r.playerID = p.id 
WHERE r.playerID = :playerId 
GROUP BY r.playerID; 

Это должно предоставить Вам следующую информацию:

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

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

+0

К сожалению, это не работает для меня. Происходит некоторая ошибка. Но спасибо. Я вижу сходство с ответом петерма, который работает на меня. – Marek123