मैं स्कीमा के बारे में स्ट्रॉबेरी से सहमत हूं। हम बेहतर प्रदर्शन और उन सभी के लिए विचारों पर चर्चा कर सकते हैं। लेकिन कुछ चैट और प्रश्न में बदलाव के बाद इसे कैसे हल किया जाए, इस पर मेरा विचार है।
विभिन्न सीमा स्थितियों से निपटने के लिए डेटा परिवर्तनों के नीचे नोट करें जिसमें उस तालिका में बिना छवियों वाली पुस्तकें और टाई-ब्रेक शामिल हैं। max(upvotes)
. का उपयोग करके टाई-ब्रेक का अर्थ . ओपी ने प्रश्न को कुछ बार बदला और चित्र तालिका में एक नया कॉलम जोड़ा।
संशोधित प्रश्न प्रति पुस्तक 1 पंक्ति मेक रिटर्न बन गया। स्क्रैच करें, प्रति पुस्तक हमेशा 1 पंक्ति, भले ही कोई चित्र न हो। लौटने के लिए छवि जानकारी अधिकतम अपवोट वाली होगी।
पुस्तक तालिका
create table books
( id int primary key,
name varchar(1000),
releasedate date,
purchasecount int
) ENGINE=InnoDB;
insert into books values(1,"fool","1963-12-18",456);
insert into books values(2,"foo","1933-12-18",11);
insert into books values(3,"fooherty","1943-12-18",77);
insert into books values(4,"eoo","1953-12-18",678);
insert into books values(5,"fooe","1973-12-18",459);
insert into books values(6,"qoo","1983-12-18",500);
मूल प्रश्न से डेटा परिवर्तन।
मुख्य रूप से नया upvotes
कॉलम।
नीचे जोड़ी गई एक टाई-ब्रेक पंक्ति शामिल है।
create table images
( bookid int,
poster varchar(150) primary key,
bucketid int,
upvotes int -- a new column introduced by OP
) ENGINE=InnoDB;
insert into images values (1,"xxx",12,27);
insert into images values (5,"pqr",11,0);
insert into images values (5,"swt",11,100);
insert into images values (2,"yyy",77,65);
insert into images values (1,"qwe",111,69);
insert into images values (1,"blah_blah_tie_break",111,69);
insert into images values (3,"qwqqe",14,81);
insert into images values (1,"qqawe",8,45);
insert into images values (2,"z",81,79);
व्युत्पन्न तालिका का विज़ुअलाइज़ेशन
यह केवल अंतिम क्वेरी के आंतरिक भाग को देखने में सहायता करने के लिए है। यह टाई-ब्रेक स्थितियों के लिए गोचा को प्रदर्शित करता है, इस प्रकार rownum
चर। हर बार bookid
. पर उस चर को 1 पर रीसेट कर दिया जाता है बदलता है अन्यथा यह वृद्धि करता है। अंत में (हमारी अंतिम क्वेरी) हम केवल rownum=1
. चाहते हैं पंक्तियाँ ताकि अधिकतम 1 पंक्ति प्रति पुस्तक (यदि कोई हो) वापस आ जाए।
अंतिम प्रश्न
select b.id,b.purchasecount,xDerivedImages2.poster,xDerivedImages2.bucketid
from books b
left join
( select i.bookid,i.poster,i.bucketid,i.upvotes,
@rn := if(@lastbookid = i.bookid, @rn + 1, 1) as rownum,
@lastbookid := i.bookid as dummy
from
( select bookid,max(upvotes) as maxup
from images
group by bookid
) xDerivedImages
join images i
on i.bookid=xDerivedImages.bookid and i.upvotes=xDerivedImages.maxup
cross join (select @rn:=0,@lastbookid:=-1) params
order by i.bookid
) xDerivedImages2
on xDerivedImages2.bookid=b.id and xDerivedImages2.rownum=1
order by b.purchasecount desc
limit 10
परिणाम
+----+---------------+---------------------+----------+
| id | purchasecount | poster | bucketid |
+----+---------------+---------------------+----------+
| 4 | 678 | NULL | NULL |
| 6 | 500 | NULL | NULL |
| 5 | 459 | swt | 11 |
| 1 | 456 | blah_blah_tie_break | 111 |
| 3 | 77 | qwqqe | 14 |
| 2 | 11 | z | 81 |
+----+---------------+---------------------+----------+
cross join
. का महत्व केवल 2 वेरिएबल्स के लिए शुरुआती मानों को पेश करना और सेट करना है। बस इतना ही।
परिणाम purchasecount
. के अवरोही क्रम में शीर्ष दस पुस्तकें हैं images
. की जानकारी के साथ यदि यह मौजूद है (अन्यथा NULL
) सबसे ऊपर वोट की गई छवि के लिए। छवि चयनित टाई-ब्रेक नियमों का सम्मान करती है, जैसा कि विज़ुअलाइज़ेशन अनुभाग में rownum
के साथ ऊपर वर्णित पहले वाले को चुनना है। ।
अंतिम विचार
मैं इसे उचित where
. में वेज करने के लिए OP पर छोड़ देता हूं खंड के अंत में क्योंकि दिए गए नमूना डेटा में खोज करने के लिए कोई उपयोगी पुस्तक नाम नहीं था। वह हिस्सा तुच्छ है। ओह, और अपनी प्राथमिक कुंजी की बड़ी चौड़ाई के लिए स्कीमा के बारे में कुछ करें। लेकिन फिलहाल यह विषय से परे है।