2015-02-04 2 views
5

Я новичок в php, и я искал последний час и прочитал всю документацию, которую я мог найти, и ничего не помогает. У меня есть таблица с множеством строк данных. Я пытаюсь выбрать один столбец из всей таблицы и добавить их все вместе. Вот что я получил. Все это говорит мне, сколько строк есть, которые соответствуют моему запросу, а не общая сумма столбца, который я хочу. Любая помощь приветствуется.PHP MYSQL PDO СУММ столбцов

$res1 = $db->prepare('SELECT sum(distance) FROM trip_logs WHERE user_id = '. $user_id .' AND status = "2"'); 
$res1->execute(); 
$sum_miles = 0; 
while($row1 = $res1->fetch(PDO::FETCH_ASSOC)) { 
$sum_miles += $row1['distance']; 
} 
echo $sum_miles; 
+1

Положите всю строку SQL в' '. – developerwjk

+0

@developerwjk mysql может использовать оба, и я уверен, что все серверы sql могут это сделать. Это не имеет ничего общего с проблемой, которая заключается в недостатке понимания [агрегирующих функций] (http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html). OP должен 'GROUP BY' что-то, если она хочет, чтобы' SUM() 'мог ... суммировать ... различные значения –

+2

Добавить псевдоним' sum (distance) as distance' –

ответ

9

Вы возвращаете только одну строку в этом случае. Измените суммируется столбец, чтобы иметь псевдоним:

SELECT SUM(distance) AS totDistance FROM trip_logs .... 

Теперь вы можете можете выбрать строку -

$row = $res1->fetch(PDO::FETCH_ASSOC); 
echo $row['totDistance']; 

Нет необходимости в цикле.

+0

, который не будет работать если нет группы по –

+0

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

+0

нет необходимости группироваться, потому что mysql сделает это сам. [Если вы используете групповую функцию в sta tement, не содержащий предложения GROUP BY, это эквивалентно группировке по всем строкам.] (http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_sum) –

2

Вы можете использовать SUM() без явно Распределите строки, потому что if you use a group function in a statement containing no GROUP BY clause, it is equivalent to grouping on all rows.

Если же вы хотите использовать SUM() функцию для чего-то немного более сложным, вы должны сгруппировать строки так, чтобы сумма может работать на том, что вы хотите.

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

$res1 = $db->prepare(" 
    SELECT 
     SUM(distance) AS distance, 
     user_id 
    FROM trip_logs WHERE status = '2' 
    GROUP BY user_id 
"); 
$res1->execute(); 
while ($row = $res1->fetch(PDO::FETCH_ASSOC)) 
{ 
    echo "user $row[user_id] has runned $row[distance] km.\n"; 
} 

Это вернет сумму расстояний пользователем, не для всех пользователей одновременно.

0

Попробуйте это, если вы используете класс: «„ 'вокруг значений полей SQL обычно использует `“ `и завернуть` `внутри не`»

class Sample_class{ 

     private $db; 

     public function __construct($database) { 
      $this->db = $database; 
     } 

     public function GetDistant($user_id,$status) { 

        $query = $this->db->prepare("SELECT sum(distance) FROM trip_logs WHERE user_id =? AND status =?"); 

        $query->bindValue(1, $user_id); 
        $query->bindValue(2, $status); 

        try{ $query->execute();  

        $rows = $query->fetch(); 
        return $rows[0]; 

       } catch (PDOException $e){die($e->getMessage());} 
      } 
    } 

$dist = new Sample_class($db); 

$user_id = 10; 
$status = 2; 

echo $dist->GetDistant($user_id,$status); 
Смежные вопросы