PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

पोस्टग्रेज - एकाधिक जुड़ने के कारण मेरी क्वेरी गलत डेटा लौटा रही है

जटिल 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. जावास्क्रिप्ट (पोस्टग्रेज डीबी) - WHERE IN ( ) क्लॉज में पैरामीटर के रूप में एक सरणी के साथ तैयार स्टेटमेंट का उपयोग कैसे करें

  2. PostgreSQL Sqlalchemy कमिटमेंट में बहुत समय लगता है

  3. बहुत अधिक कॉलम वाली तालिका के नुकसान

  4. Postgresql में 24:00:00 से ऊपर समय स्टोर करने का सबसे अच्छा तरीका?

  5. PostgreSQL:गिनती के बाद वापसी संदेश =0