PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Postgres - Beberapa gabungan menyebabkan kueri saya mengembalikan data yang salah

Bangun SQL kompleks selangkah demi selangkah.

Ini memberi Anda buku-buku yang memiliki kedua tag yang diperlukan. Ini hanya dapat diandalkan seperti definisi tabel Anda. Definisi tabel Anda tidak boleh mengizinkan satu buku memiliki tag yang sama dua kali. Anda memerlukan batasan UNIK pada (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

Anda dapat menggunakannya dalam GABUNG.

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

Bergabung di tabel suara harus menghilangkan book_id 6 dari hasilnya. (Tidak ada suara untuk 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

Sekarang Anda dapat menambahkan kolom suara ke kueri.

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

Akhirnya, Anda dapat menjumlahkan suara.

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

Versi Anda tidak berfungsi, karena mengembalikan nomor id buku yang salah. Kombinasi JOIN pada books_votes dan klausa WHERE tidak melakukan apa yang Anda harapkan.

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

Buku 2 disertakan bukan karena memiliki kedua tag, tetapi karena memiliki dua suara.

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. Memindahkan cluster data postgresql

  2. Ganti urutan serial di PostgreSql dengan Entity Framework (C#)

  3. Arti dari prompt baris perintah yang berbeda di PostgreSQL?

  4. COPY CSV Postgres dari/impor tidak menghormati header CSV

  5. Gunakan di mana kueri dalam tipe data JSONB di Rails Postgres