在一个简单的关联表上使用mysql中的关系划分



我们有一个关联表,它用标记连接线程。我们正试图找出一个查询,该查询将为我们提供与标记ID的组合绑定的任何线程ID。我在以下位置创建了一个sqlfiddle:

http://sqlfiddle.com/#!9/c8ebe/3

因此,该表的结构如下:

CREATE TABLE `threads_tags` (
`ID_threads` bigint(20),
`ID_tags` bigint(20)
);

一些样本数据可能如下所示:

ID_threads   ID_tags
2             12
4             12
9             10
2             21
3             2
2             1
5             1
5             21

在我们的示例中,我们将有标记ID为12和1,并且我们需要一个为ID_threads返回2的查询,因为这是唯一一个同时具有ID_tags=12和ID_tags=1的ID_thread。我们可能需要匹配的标签数量没有限制。我认为我们需要使用关系划分,我尝试使用这个查询:

SELECT
ID_threads
FROM
threads_tags tt1
WHERE
ID_tags IN (1,12)
GROUP BY
ID_threads
HAVING
count(*) = (
SELECT
count(*)
FROM
threads_tags tt2
WHERE
ID_threads = tt1.ID_threads
)

不过它似乎不起作用。我想过在mysql中使用类似于Relationaldivision的解决方案,而不使用aggregate函数?但在该示例中,我不确定将要输入到查询中的ID_tag列表放在哪里。我真的是关系划分类型查询的新手,所以如果您能在这里给我任何帮助,我将不胜感激。

这应该是您想要的:

SELECT ID_threads FROM threads_tags
WHERE ID_tags IN (1,12)
GROUP BY ID_threads
HAVING COUNT(DISTINCT ID_tags) = 2;

HAVING COUNT...后面的数字2是列表中的值的数量(在本例中为2-1和12)。

最新更新