PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Postgres - Nhiều liên kết khiến truy vấn của tôi trả về dữ liệu không chính xác

Xây dựng SQL phức tạp từng bước.

Điều này cung cấp cho bạn những cuốn sách có cả hai thẻ bắt buộc. Nó chỉ đáng tin cậy như định nghĩa bảng của bạn. Định nghĩa bảng của bạn không được cho phép một cuốn sách có cùng một thẻ hai lần. Bạn cần một ràng buộc DUY NHẤT đối với (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

Bạn có thể sử dụng nó trong một 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

Tham gia vào bảng bình chọn nên bỏ book_id 6 khỏi kết quả. (Không có phiếu bầu nào cho 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

Bây giờ bạn có thể thêm cột biểu quyết vào truy vấn.

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

Cuối cùng, bạn có thể tổng số phiếu bầu.

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

Phiên bản của bạn không hoạt động vì nó trả về số id sách sai. Sự kết hợp của mệnh đề JOIN trên books_votes và mệnh đề WHERE không thực hiện những gì bạn mong đợi.

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

Quyển 2 được đưa vào không phải vì nó có cả hai thẻ, mà bởi vì nó có hai phiếu bầu.

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. Tổng hợp các cột với các bộ lọc bổ sung (riêng biệt)

  2. Truy vấn XPath thành dữ liệu phân cấp, duy trì mối quan hệ tổ tiên - con cháu

  3. Danh sách Python đến Mảng PostgreSQL

  4. Postgres:CHỌN tên cột dựa trên giá trị Boolean

  5. Nhập tệp .sql trong pgadmin iii