Как суммировать одинаковые значения с MySQL и PHP? - PullRequest
3 голосов
/ 19 ноября 2011

Как можно суммировать те же значения с MySQL?Вот моя таблица, например:

--Id---------Name--
--1 ---------Value1
--2 ---------Value3
--3 ---------Value2
--4 ---------Value2
--5 ---------Value3
--6 ---------Value2

Теперь я должен сделать SQL-запрос, который суммирует количество одинаковых значений, например:

SELECT SUM(IF(Name = 'Value1', SUM, 0)) AS Value1_total
   , SUM(IF(Name = 'Value2', SUM, 0)) AS Value2_total
   , SUM(IF(Name = 'Value3', SUM, 0)) AS Value3_total

Ответы [ 3 ]

2 голосов
/ 19 ноября 2011

Попробуйте:

SELECT name, COUNT(name) amount FROM table 
GROUP BY name;

Это даст вам фактическое значение поля имени и количество раз, с которым оно встречалось.

$query = "SELECT name, COUNT(name) amount FROM table 
          GROUP BY name";
if (($result = mysqli_query($query))) {
  $data = array();
  while (($row = mysql_fetch_array($result,MYSQL_ASSOC))) {
    $data[$row['name']] = $row['amount'];
  }
  // then you can
  if (isset($data['Value1'])) {
    echo $data['Value1'];
  }
}

Вы также можете попробовать следующее:

SELECT a.s Value1_Total, b.s Value2_Total, c.s Value3_Total FROM t2,
(SELECT COUNT(name) s FROM t2 WHERE name = 'AAA') a,
(SELECT COUNT(name) s FROM t2 WHERE name = 'BBB') b,
(SELECT COUNT(name) s FROM t2 WHERE name = 'CCC') c;
2 голосов
/ 19 ноября 2011

Поскольку вы хотите, чтобы в одном запросе были возвращены 3 суммы, вы находитесь на правильном пути, но это должно быть:

SELECT SUM(IF(Name = 'Value1',1,0)) AS Value1_total
                              ^--- change 'SUM' to 1

но великий эмитент в том, что это не очень расширяемо. Вы должны иметь эту конструкцию SUM () для каждого поля, которое вы хотите суммировать таким образом. Было бы более эффективно использовать стандартный групповой запрос, а затем построить эту «горизонтальную» структуру в коде на стороне клиента:

SELECT Name, COUNT(id)
FROM yourtable
WHERE (Name IN ('Value1', 'Value2', 'Value3', ...))
GROUP BY Name
1 голос
/ 19 ноября 2011

Редактировать: это должно работать, однако это очень неэффективно. Возможно, вы могли бы использовать PIVOT, если хотите сделать его более эффективным.

select 
   (select count(1) from table where name='Value1') as Value1_total
   (select count(1) from table where name='Value2') as Value2_total
   (select count(1) from table where name='Value3') as Value3_total
from 
  dual;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...