查询多对多链接表

时间:2019-06-28 13:32:33

标签: mysql sql node.js querying

我有一个用于多对多关系的链接表,其中的字段  -

  • idNote
  • idTag

我想过滤与包含指定数量标签的笔记相关联的所有标签。

例如,如果我选择标签“ Running”,“ Form”和“ Times”,那么我想查看与该标签相关的所有标签。带有这三个标签的笔记。

用户将在前端使用此过程来优化他们正在寻找的结果,因此我需要能够使用代码(node.js)生成此SQL,并可能使用标记进行过滤发生了很多次。

我有下面的SQL代码,它可以查询两个标签,但是存在一些问题:

  1. 它似乎没有效率
  2. 如果需要添加文件管理器的另一层,则无法通过代码轻松生成
SELECT DISTINCT idtag FROM table WHERE idnote IN (SELECT idnote FROM 
(SELECT * FROM table WHERE idnote IN (SELECT idnote FROM table WHERE idtag 
= 'Example')) as t1 where t1.idtag = 'SecondExample');

我希望就如何提高此代码的效率以及将sql语句转换为易于代码生成的内容提出一些建议。

3 个答案:

答案 0 :(得分:1)

听起来像数据陷阱,笛卡尔积 https://en.wikipedia.org/wiki/Cartesian_product

有什么可以桥接两个表的吗? 就像我们可以加入的两者之间的公用表一样? 代替N:N
表A将与注释表(B)和标签表(C)相同 我们可以将表A以1:N的形式连接到表B 表A也以1:N的形式加入C

然后,您可以将两个独立的事实与一个公用表缝合在一起

答案 1 :(得分:0)

尝试这样的事情:

; with cteTagList as 
    (select 'Example' idtag
    union select 'SecondExample'
    --...
    union select 'LastExample'
    )
select t.idnote
from table t inner join cteTabList l on l.idtag = t.idtag
group by t.idnote
having count(*) = [NUMBER_OF_SEARCH_TAGS]

在其中生成包含所有搜索标签的CTE(公用表表达式)的位置。将其与多对多关系表关联,然后仅选择帽子计数等于用户输入的搜索标签数量的那些注释,在查询中记为[NUMBER_OF_SEARCH_TAGS]

答案 2 :(得分:0)

我将您的'Running','Form','Times'示例用作指定的标记集。

select distinct idTag from table 
where idNote in (select idNote from table where idTag in ('Running'))
and idNote in (select idNote from table where idTag in ('Form'))
and idNote in (select idNote from table where idTag in ('Times'))