I'm trying to write a select statement in MySQL to get 5 rows after I get my match then sum how many times those numbers were repeated.
Example:
Raw Table
id | number |
---|---|
1 | 1 |
2 | 0 |
3 | 9 |
4 | 14 |
5 | 11 |
6 | 0 |
7 | 3 |
8 | 4 |
9 | 10 |
10 | 9 |
11 | 0 |
12 | 5 |
13 | 3 |
14 | 11 |
15 | 0 |
I need to find every row with the number 0, then after that select and show 5 rows after and counting the appearance of the numbers. How can I select the numbers and get the count as a result?
The result of the first select should be like this:
id | number |
---|---|
3 | 9 |
4 | 14 |
5 | 11 |
6 | 0 |
7 | 3 |
7 | 3 |
8 | 4 |
9 | 10 |
10 | 9 |
11 | 0 |
12 | 5 |
13 | 3 |
14 | 11 |
15 | 0 |
The result of the count for every number in the last query.
Number | Count |
---|---|
9 | 2 |
14 | 1 |
11 | 2 |
0 | 3 |
3 | 3 |
4 | 1 |
10 | 1 |
5 | 1 |
CodePudding user response:
This is a demo to get expected results:
Select numbers:
SELECT id, number
FROM (
SELECT b.id, b.number, ROW_NUMBER() OVER(PARTITION BY a.id ORDER BY b.id ASC) r
FROM numbers a
JOIN numbers b ON a.id < b.id
WHERE a.number = 0
) t WHERE t.r <= 5
ORDER BY id
Count numbers:
WITH n AS (
SELECT id, number
FROM (
SELECT b.id, b.number, ROW_NUMBER() OVER(PARTITION BY a.id ORDER BY b.id ASC) r
FROM numbers a
JOIN numbers b ON a.id < b.id
WHERE a.number = 0
) t WHERE t.r <= 5
)
SELECT number, COUNT(*) counts
FROM n
GROUP BY number
Sample data:
CREATE TABLE numbers (
id INT PRIMARY KEY auto_increment,
number INT NOT NULL
);
INSERT INTO numbers ( number ) VALUES (1),(0),(9),(14),(11),(0),(3),(4),(10),(9),(0),(5),(3),(11),(0);
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=1fe71080cfb27680eb2a37b721e5de2d
Update for MySQL v5.7
SELECT n.*
FROM numbers n
JOIN (
SELECT a.id, SUBSTRING_INDEX(GROUP_CONCAT(b.id ORDER BY b.id SEPARATOR ','), ',', 5) selections
FROM numbers a
JOIN numbers b ON a.id < b.id
WHERE a.number = 0
GROUP BY a.id
) t ON FIND_IN_SET(n.id, t.selections)
ORDER BY n.id
SELECT n.number, COUNT(*) counts
FROM numbers n
JOIN (
SELECT a.id, SUBSTRING_INDEX(GROUP_CONCAT(b.id ORDER BY b.id SEPARATOR ','), ',', 5) selections
FROM numbers a
JOIN numbers b ON a.id < b.id
WHERE a.number = 0
GROUP BY a.id
) t ON FIND_IN_SET(n.id, t.selections)
GROUP BY n.number
ORDER BY n.number
https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=3be09acab5cd696ec4b01585eb5c32ed