Question

I want to be able to retrieve, for each row, the number of total appearances of one value of one field.

CREATE TABLE `events` (
`id` INT NOT NULL AUTO_INCREMENT,
`country` VARCHAR(2) NOT NULL,
PRIMARY KEY (`id`));

INSERT INTO `events` (`country`) VALUES
('es'), ('fr'), ('uk'),
('uk'), ('es'), ('uk'),
('fr'), ('it'), ('es'),
('es'), ('it'), ('uk'),
('fr'), ('es'), ('de')

That is, given this SQLFiddle, I want to able to add a field to the results, that conditionally adds the number of appearances of each value of field country.

SELECT * from `events`;

ID  | COUNTRY | TIMES
----+---------+------
1   | es      | 5
2   | fr      | 3
3   | uk      | 4
4   | uk      | 4
5   | es      | 5
6   | uk      | 4
7   | fr      | 3
8   | it      | 2
9   | es      | 5
10  | es      | 5
11  | it      | 2
12  | uk      | 4
13  | fr      | 3
14  | es      | 5
15  | de      | 1

If possible, it would be great that partial results (LIMIT x, y) would still return total sums for each field:

SELECT * from `events` LIMIT 3, 7;

ID  | COUNTRY | TIMES
----+---------+------
4   | uk      | 4
5   | es      | 5
6   | uk      | 4
7   | fr      | 3
8   | it      | 2
9   | es      | 5
10  | es      | 5

As per this SQLFiddle.

Was it helpful?

Solution

Is this what you want?

select e.*,
       (select count(*) from events e2 where e2.country = e.country
       ) as times
from `events` e;

It seems to meet your needs. If you want to actually change the table:

alter table events add times unsigned;

update events e
    set times = (select count(*) from events e2 where e2.country = e.country);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top