MySQL 5.7.22 veritabanında iki tablo var: posts
ve reasons
. Her gönderi satırında birçok neden satırı vardır ve bunlara aittir. Her nedenin kendisiyle ilişkili bir ağırlığı vardır ve bu nedenle her bir gönderinin kendisiyle ilişkili toplam bir toplam ağırlığı vardır.
10 puan ağırlığındaki her bir artış için (yani, 0, 10, 20, 30, vb. İçin), toplam ağırlığı bu artıştan daha az veya ona eşit olan bir dizi direk almak istiyorum. Bunun için böyle bir sonuç bekliyorum:
weight | post_count
--------+------------
0 | 0
10 | 5
20 | 12
30 | 18
... | ...
280 | 20918
290 | 21102
... | ...
1250 | 118005
1260 | 118039
1270 | 118040
Toplam ağırlıklar yaklaşık olarak normal olarak dağıtılır, birkaç çok düşük değer ve birkaç çok yüksek değer (maksimum şu anda 1277'dir), ancak ortadaki çoğunluk. Yaklaşık 120.000 satır posts
ve 120 inç civarında satırlar var reasons
. Her gönderinin ortalama 5 veya 6 nedeni vardır.
Tabloların ilgili kısımları aşağıdaki gibidir:
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)
);
Şimdiye kadar, bir numaraya gönderi kimliğini ve toplam ağırlığını bırakmayı , ardından toplu bir sayı elde etmek için bu görünüme katılmayı denedim :
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;
Ancak bu, alışılmadık derecede yavaş - sonlandırmadan 15 dakika boyunca çalışmasına izin verdim, bu da üretimde yapamam.
Bunu yapmanın daha etkili bir yolu var mı?
Tüm veri kümesini test etmekle ilgileniyorsanız, buradan indirilebilir . Dosya yaklaşık 60 MB, yaklaşık 250 MB'a kadar genişler. Alternatif olarak, burada bir GitHub özünde 12.000 satır var .
w.weight
- doğru mu? Lte toplam ağırlığı (ilişkili neden satırlarının ağırlık toplamı) ile mesajları saymak için arıyorumw.weight
.