sql >> Database teknologi >  >> RDS >> PostgreSQL

Postgres - Flere joinforbindelser får min forespørgsel til at returnere forkerte data

Byg kompleks SQL trin for trin.

Dette giver dig de bøger, der har begge de nødvendige tags. Det er kun så pålideligt som din tabeldefinition. Din tabeldefinition bør ikke tillade, at én bog har det samme tag to gange. Du skal bruge en UNIK begrænsning på (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

Du kan bruge det i en JOIN.

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

Tilmelding på stemmebordet bør udelade book_id 6 fra resultatet. (Ingen stemmer for 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

Nu kan du tilføje stemmekolonnen til forespørgslen.

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

Endelig kan du summere stemmerne.

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

Din version virker ikke, fordi den returnerer de forkerte bog-id-numre. Kombinationen af ​​JOIN på books_votes og WHERE-klausulen gør ikke, hvad du forventede, at den ville gøre.

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

Bog 2 er inkluderet, ikke fordi den har begge tags, men fordi den har to stemmer.

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. Advarsel:join() [function.join]:Ugyldige argumenter bestået (PHP/MySQL-forespørgsel)

  2. Fejl ved oprettelse af forbindelse til Oracle ODBC i Excel

  3. Brug af r sf::st_write til ikke-offentligt skema i PostgreSQL

  4. Brug af MySQL-replikering (Master/Slave) med MyBatis