जटिल SQL चरण दर चरण बनाएँ।
यह आपको वे पुस्तकें देता है जिनमें दोनों आवश्यक टैग हैं। यह आपकी तालिका परिभाषा के समान ही विश्वसनीय है। आपकी तालिका परिभाषा में एक पुस्तक को एक ही टैग को दो बार रखने की अनुमति नहीं होनी चाहिए। आपको (book_id, tag_id) पर एक अद्वितीय बाधा की आवश्यकता है।
SELECT book_id
FROM books_tags
WHERE books_tags.tag_id IN (716, 101)
GROUP BY book_id
HAVING COUNT(tag_id) = 2
book_id
--
6
3
आप इसे जॉइन में इस्तेमाल कर सकते हैं।
SELECT books.id
FROM books
INNER JOIN (
SELECT book_id
FROM books_tags
WHERE books_tags.tag_id IN (716, 101)
GROUP BY book_id
HAVING COUNT(tag_id) = 2) bt ON bt.book_id = books.id
book_id
--
6
3
मतों की मेज पर शामिल होने से Book_id 6 को परिणाम से हटा देना चाहिए। (6 के लिए कोई वोट नहीं)
SELECT books.id
FROM books
INNER JOIN (
SELECT book_id
FROM books_tags
WHERE books_tags.tag_id IN (716, 101)
GROUP BY book_id
HAVING COUNT(tag_id) = 2) bt ON bt.book_id = books.id
INNER JOIN books_votes bv ON bv.book_id = books.id
book_id
--
3
अब आप क्वेरी में वोट कॉलम जोड़ सकते हैं।
SELECT books.id, bv.vote
FROM books
INNER JOIN (
SELECT book_id
FROM books_tags
WHERE books_tags.tag_id IN (716, 101)
GROUP BY book_id
HAVING COUNT(tag_id) = 2) bt ON bt.book_id = books.id
INNER JOIN books_votes bv ON bv.book_id = books.id
book_id vote
--
3 1
अंत में, आप वोटों का योग कर सकते हैं।
SELECT books.id, SUM(bv.vote) AS total_votes
FROM books
INNER JOIN (
SELECT book_id
FROM books_tags
WHERE books_tags.tag_id IN (716, 101)
GROUP BY book_id
HAVING COUNT(tag_id) = 2) bt ON bt.book_id = books.id
INNER JOIN books_votes bv ON bv.book_id = books.id
GROUP BY books.id;
book_id total_votes
--
3 1
आपका संस्करण काम नहीं करता है, क्योंकि यह गलत पुस्तक आईडी नंबर देता है। Books_votes पर JOIN और WHERE क्लॉज का संयोजन वह नहीं करता है जिसकी आपने अपेक्षा की थी।
SELECT books.id AS books_id
FROM books
JOIN books_votes ON books.id = books_votes.book_id
JOIN books_tags ON books.id = books_tags.book_id
WHERE books_tags.tag_id IN (716, 101)
GROUP BY books.id
books_id
--
3
2
पुस्तक 2 को इसलिए शामिल नहीं किया गया है क्योंकि इसमें दोनों टैग हैं, बल्कि इसलिए कि इसमें दो वोट हैं।
SELECT books.id AS books_id, books_tags.tag_id, books_votes.vote
FROM books
JOIN books_votes ON books.id = books_votes.book_id
JOIN books_tags ON books.id = books_tags.book_id
WHERE books_tags.tag_id IN (716, 101)
ORDER BY books_id, tag_id
book_id tag_id vote
--
2 101 1
2 101 1
3 101 1
3 716 1