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