Tôi có hai bảng trong cơ sở dữ liệu MySQL 5.7.22: posts
và reasons
. Mỗi hàng bài có và thuộc nhiều hàng lý do. Mỗi lý do có trọng số liên quan đến nó và do đó mỗi bài đăng có tổng trọng số liên quan đến nó.
Đối với mỗi lần tăng 10 điểm trọng lượng (ví dụ: 0, 10, 20, 30, v.v.), tôi muốn nhận được số lượng bài đăng có tổng trọng lượng nhỏ hơn hoặc bằng mức tăng đó. Tôi mong đợi kết quả cho điều đó trông giống như thế này:
weight | post_count
--------+------------
0 | 0
10 | 5
20 | 12
30 | 18
... | ...
280 | 20918
290 | 21102
... | ...
1250 | 118005
1260 | 118039
1270 | 118040
Tổng trọng lượng được phân phối xấp xỉ bình thường, với một vài giá trị rất thấp và một vài giá trị rất cao (tối đa hiện là 1277), nhưng phần lớn ở giữa. Chỉ có dưới 120.000 hàng trong posts
và khoảng 120 in reasons
. Mỗi bài viết có trung bình 5 hoặc 6 lý do.
Các phần có liên quan của các bảng trông như thế này:
CREATE TABLE `posts` (
id BIGINT PRIMARY KEY
);
CREATE TABLE `reasons` (
id BIGINT PRIMARY KEY,
weight INT(11) NOT NULL
);
CREATE TABLE `posts_reasons` (
post_id BIGINT NOT NULL,
reason_id BIGINT NOT NULL,
CONSTRAINT fk_posts_reasons_posts (post_id) REFERENCES posts(id),
CONSTRAINT fk_posts_reasons_reasons (reason_id) REFERENCES reasons(id)
);
Cho đến nay, tôi đã thử thả ID bài đăng và tổng trọng lượng vào một chế độ xem, sau đó tham gia chế độ xem đó vào chính nó để có được tổng số:
CREATE VIEW `post_weights` AS (
SELECT
posts.id,
SUM(reasons.weight) AS reason_weight
FROM posts
INNER JOIN posts_reasons ON posts.id = posts_reasons.post_id
INNER JOIN reasons ON posts_reasons.reason_id = reasons.id
GROUP BY posts.id
);
SELECT
FLOOR(p1.reason_weight / 10) AS weight,
COUNT(DISTINCT p2.id) AS cumulative
FROM post_weights AS p1
INNER JOIN post_weights AS p2 ON FLOOR(p2.reason_weight / 10) <= FLOOR(p1.reason_weight / 10)
GROUP BY FLOOR(p1.reason_weight / 10)
ORDER BY FLOOR(p1.reason_weight / 10) ASC;
Tuy nhiên, đó là chậm một cách khó tin - tôi để nó chạy trong 15 phút mà không bị chấm dứt, điều mà tôi không thể làm trong sản xuất.
Có cách nào hiệu quả hơn để làm điều này?
Trong trường hợp bạn muốn thử nghiệm toàn bộ dữ liệu, có thể tải xuống tại đây . Các tập tin là khoảng 60 MB, nó mở rộng đến khoảng 250 MB. Thay phiên, có 12.000 hàng trong một ý chính GitHub ở đây .
w.weight
- có đúng không? Tôi đang tìm cách đếm các bài đăng có tổng trọng số (tổng trọng số của các hàng lý do liên quan của chúng) của ltew.weight
.