0

我从链接表中选择并过滤掉多余的结果时遇到问题。

出版物通过package_publications表属于包。

例如,我知道我的出版物的 id 是 11 和 47。我想返回一个只包含这些出版物的包。

现在,如果我进行连接并在明显的内部连接之后执行类似操作,这将简单地返回在package_publications链接表where publications.id IN (11, 47)中具有这些值之一的所有包。

我想匹配只有两个(或更多 - 它不限于两个)的包。实际上,当我想要 AND 但我不知道如何以 SQL 方式处理它时,我正在使用 OR。

4

2 回答 2

0

您最好的选择是相关子查询。另一种选择是使用 distinct / group by 连接,但效果不佳,尤其是在较大的表上。

子查询:

SELECT * FROM `packages`
 WHERE 2 = (
   SELECT count(*) FROM `package_publications`
    WHERE `packages`.id = `package_publications`.package_id
      AND `package_publications`.publication_id IN (11, 47)
 )
于 2009-07-25T14:37:38.943 回答
0

由于其中包含两个发布 ID 的包将在结果集中出现两次,因此您可以使用它来过滤。它不是很有效,但在找到更好的解决方案之前可能会解决问题。

SELECT * FROM packages WHERE packages.id IN (
  SELECT package_publications.package_id
  WHERE package_publications.publication_id IN (11,47)
  GROUP BY package_publications.package_id
  HAVING COUNT(package_publications.package_id) = 2
)
于 2009-07-25T14:46:51.503 回答