作者:小白石 | 来源:互联网 | 2024-12-22 19:46
假设我们有一个会员表,结构如下:
MemberID Name BookID
1 ABC 10
1 ABC 14
2 XYZ 10
3 PQR 14
目标是从该表中选择那些同时拥有BookID为10和14的会员。
预期结果:
MemberID
1
尝试使用以下SQL语句,但未能达到预期效果:
SELECT MemberID FROM member WHERE BookID IN (10,14)
此查询会返回所有拥有BookID为10或14的会员,而不是同时拥有这两个BookID的会员。
正确的解决方法是使用分组和条件过滤:
SELECT MemberID, GROUP_CONCAT(BookID) AS BookIDs
FROM member
GROUP BY MemberID
HAVING FIND_IN_SET(10, BookIDs) > 0 AND FIND_IN_SET(14, BookIDs) > 0
这段代码通过将每个会员的BookID连接成字符串,并使用HAVING子句来确保只有同时包含BookID为10和14的会员才会被选中。
另一种解决方案是使用自连接(Self Join),具体如下:
SELECT DISTINCT x.MemberID
FROM member x
JOIN member y ON x.MemberID = y.MemberID
WHERE x.BookID = 10 AND y.BookID = 14
这种方法通过将表与自身连接,确保同一会员在不同行中分别拥有BookID为10和14,从而实现筛选。