привет, Как я могу группировать данные на основе внешнего вида, в предварительно заданные ведра в MYSQL? скажем, мои выступления похожи на изображение 1, и мне нужен вывод, как показано на рисунке 2? (значения диапазонов предварительно заданы) заблаговременно
Вы можете решить это через вторую таблицу, которая определяет диапазоны, а затем использовать соединение в запросе GROUP BY
. Шаги будут следующими:
JOIN
в новой таблице диапазонов, чтобы определить, в каком ведре будет установлен счет.Создание и заполнение новой таблицы для диапазонов будет простым (попробуйте избежать названия "диапазон", поскольку это ключевое слово):
CREATE TABLE sections
(
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
start INT,
end INT
);
Заполните его своими разделами:
INSERT INTO sections(name, start, end) VALUES ('0-2', 0, 2);
[...]
INSERT INTO sections(name, start, end) VALUES ('11+', 11, 1<<31);
Создайте запрос для группировки и подсчета ваших данных. В этом примере используется таблица с названием "события" с столбцами "catId" и "timestamp":
SELECT
COUNT(*) as eventCount
FROM
events
GROUP BY
catId
Это может создать такой результат (имеется только 5 различных кошачьих идентификаторов):
+------------+
| eventCount |
+------------+
| 3 |
| 3 |
| 5 |
| 1 |
| 1 |
+------------+
Теперь вам нужно ПРИСОЕДИНИТЬ этот результат в таблицу sections
, используя условие ON
. Для учебных целей промежуточный (но не рабочий) запрос будет выглядеть следующим образом:
SELECT
s.id,
s.name,
s.start,
s.end,
COUNT(*) AS sectionCount
FROM
sections s
JOIN
(__your_previous_result_here__) e
ON
e.eventCount BETWEEN s.start AND s.end
GROUP BY
s.id
Ваш общий запрос будет выглядеть так:
SELECT
s.id,
s.name,
s.start,
s.end,
COUNT(*) AS sectionCount
FROM
sections s
JOIN
(SELECT
COUNT(*) as eventCount
FROM
events
GROUP BY
catId) e
ON
e.eventCount BETWEEN s.start AND s.end
GROUP BY
s.id
Обратите внимание, что здесь используются псевдонимы s
и e
. В зависимости от входных данных результат будет выглядеть так:
+----+------+-------+------------+--------------+
| id | name | start | end | sectionCount |
+----+------+-------+------------+--------------+
| 1 | 0-1 | 0 | 1 | 2 |
| 2 | 2-4 | 2 | 4 | 2 |
| 3 | 5++ | 5 | 2147483647 | 1 |
+----+------+-------+------------+--------------+