আমার একটি মাইএসকিউএল 5.7.22 ডাটাবেসে দুটি টেবিল রয়েছে: posts
এবং reasons
। প্রতিটি পোস্ট সারিতে অনেকগুলি কারণ সারি রয়েছে এবং এর সাথে সম্পর্কিত। প্রতিটি কারণের সাথে এর সাথে যুক্ত ওজন থাকে এবং প্রতিটি পোস্টের সাথে এটির সাথে মোট সামগ্রিক ওজন যুক্ত থাকে।
10 পয়েন্ট ওজনের প্রতিটি বৃদ্ধির জন্য (উদাহরণস্বরূপ 0, 10, 20, 30, ইত্যাদি) এর জন্য, আমি এমন একটি পোস্টের একটি কাউন্ট পেতে চাই যার মোট ওজন সেই বর্ধনের চেয়ে কম বা সমান have আমি ফলাফলগুলি এর মতো দেখতে কিছু প্রত্যাশা করব:
weight | post_count
--------+------------
0 | 0
10 | 5
20 | 12
30 | 18
... | ...
280 | 20918
290 | 21102
... | ...
1250 | 118005
1260 | 118039
1270 | 118040
মোট ওজন প্রায় খুব সাধারণভাবে বিতরণ করা হয়, কয়েকটি খুব কম মান এবং কয়েকটি খুব উচ্চ মানের (সর্বাধিক বর্তমানে 1277), তবে মাঝের সংখ্যাগরিষ্ঠ। এখানে কেবলমাত্র 120,000 সারি রয়েছে posts
এবং প্রায় 120 টি সারি রয়েছে reasons
। প্রতিটি পোস্টের গড়ে 5 বা 6 টি কারণ রয়েছে।
টেবিলগুলির প্রাসঙ্গিক অংশগুলি এর মতো দেখাচ্ছে:
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)
);
এখনও অবধি, আমি পোস্ট আইডি এবং মোট ওজনকে একটি ভিউতে ফেলে দেওয়ার চেষ্টা করেছি , তারপরে একটি সংখ্যক গণনা পাওয়ার জন্য নিজের মধ্যে সেই ভিউটিতে যোগ দিয়েছি :
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;
এটি, তবে, অসাধারণভাবে ধীর - আমি এটি 15 মিনিটের জন্য শেষ না করে চালিয়ে দেই, যা আমি উত্পাদন করতে পারি না।
এটি করার আরও কার্যকর উপায় আছে?
আপনি যদি পুরো ডেটাसेट পরীক্ষা করতে আগ্রহী হন তবে এটি এখানে ডাউনলোডযোগ্য । ফাইলটি 60MB এর কাছাকাছি, এটি 250MB এর কাছাকাছি প্রসারিত হয়। পর্যায়ক্রমে, এখানে গিটহাবের টুকরোতে 12,000 সারি রয়েছে ।
w.weight
- এটি কি ঠিক? আমি lte এর মোট ওজন (তাদের সম্পর্কিত কারণ সারিগুলির ওজনের যোগফল) সহ পোস্টগুলি গণনা করতে চাইw.weight
।