Как я могу найти соотношение? - PullRequest
0 голосов
/ 07 января 2012

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

CREATE TABLE `counts` (
  `name` CHAR(35) NOT NULL DEFAULT '',
  `total` INT(11) NOT NULL,
  `type` tinyint(4) NOT NULL,
  `locale_id` SMALLINT(6) NOT NULL,
  PRIMARY KEY (`name`,`type`,`locale_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO `counts` (`name`, `total`, `type`, `locale_id`)
VALUES
    ('k3k3k',888,3,1),
    ('krkrkrkr',333,3,1),
    ('zzxzx',22,3,1);

nameэто слово тега, а total - сколько раз оно упоминается в таблице tag.Мне нужно получить процент от каждого тега для построения облака тегов.

Как я могу это сделать?

Ответы [ 3 ]

3 голосов
/ 07 января 2012
   select 
     name, 
     total,
     total/(select sum(total) from counts)*100 as percentage
   from counts
2 голосов
/ 07 января 2012

Что-то вроде этого должно сделать это:

SELECT name,(total/(SELECT SUM(total) FROM counts)) * 100 
FROM counts WHERE name = 'k3k3k' 

Вы хотите округлить результат или сделать другое форматирование ...

1 голос
/ 07 января 2012

Нормализация! То есть выберите максимальное количество и основывайте на нем все остальные значения.

SELECT name, (total / @max_count * 100) percentage
FROM counts, (SELECT @max_count := MAX(total) FROM counts) t1;

Результат:

+----------+------------+
| name     | percentage |
+----------+------------+
| k3k3k    |   100.0000 |
| krkrkrkr |    37.5000 |
| zzxzx    |     2.4775 |
+----------+------------+

Или вы можете использовать SUM вместо MAX

SELECT name, (total / @max_count * 100) percentage
FROM counts, (SELECT @max_count := SUM(total) FROM counts) t1;


+----------+------------+
| name     | percentage |
+----------+------------+
| k3k3k    |    71.4401 |
| krkrkrkr |    26.7900 |
| zzxzx    |     1.7699 |
+----------+------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...