【发布时间】:2013-11-11 04:00:25
【问题描述】:
如果没有集合运算符,我如何才能找到任何涵盖三个不同 SQL 系统中的两个的书籍。我正在使用三个主题 id 'SSRV'、'ORA'、'MySQL' 并且需要输出任意三个中的 2 个。例如,这本书可能有一个主题 SSRV 和一个 ORA 主题,但没有 MySQL。这些主题的任意两种组合都足以通过我们的过滤器。
我想显示符合此测试的书籍的 book_id 和标题。
SELECT book_id
, title
FROM a_bkinfo.books B
WHERE book_id IN (
SELECT book_id
FROM a_bkinfo.book_topics BT
WHERE topic_id = 'SSRV' )
AND book_id IN (
SELECT book_id
FROM a_bkinfo.book_topics BT
WHERE topic_id = 'ORA' )
AND book_id IN (
SELECT book_id
FROM a_bkinfo.book_topics BT
WHERE topic_id = 'MySQL' )
AND book_id IN (
SELECT COUNT(*)
FROM (
SELECT book_id
, count(topic_id) AS topics
FROM a_bkinfo.book_topics BT
GROUP BY book_id
HAVING count(topic_id) = 2
) t
;
更新版本:
SELECT book_id
, title
FROM a_bkinfo.books B
WHERE book_id IN (
SELECT book_id
FROM a_bkinfo.book_topics BT
WHERE topic_id ='SSRV'
OR topic_id ='ORA' )
AND book_id IN (
SELECT book_id
FROM a_bkinfo.book_topics BT
WHERE topic_id ='SSRV'
OR topic_id ='MySQL')
AND book_id IN (
SELECT book_id
FROM a_bkinfo.book_topics BT
WHERE topic_id ='ORA'
OR topic_id ='MySQL');
【问题讨论】:
-
更新后的查询还将同时返回所有 3 种类型的书籍
-
所以你明确地只希望 2 匹配,但如果所有 3 匹配则失败?如果一本书涵盖了我正在寻找的所有 3 个主题,我为什么要排除它。您还提到没有“设置”运算符...您指的是 [where topic_id in ('ORA', 'SSRV', 'MySQL')] 如果是这样,为什么在查询中这是一件坏事?
标签: mysql subquery logical-operators