首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为多个标签的标签系统创建sql查询?

如何为多个标签的标签系统创建sql查询?
EN

Stack Overflow用户
提问于 2020-07-23 21:34:35
回答 1查看 148关注 0票数 2

我有3个表,不知道如何创建一系列sql查询(如果可能的话,只创建一个复杂的查询)。这些表包括:

代码语言:javascript
复制
CREATE TABLE IF NOT EXISTS excerpt(
  excerptID INT UNSIGNED NOT NULL AUTO_INCREMENT, 
  author VARCHAR(45) NOT NULL, 
  title VARCHAR(255) NOT NULL, 
  text VARCHAR(1000) NOT NULL,
  comments VARCHAR(1000) NOT NULL,
  PRIMARY KEY (excerptID)
) ENGINE=INNODB CHARACTER SET utf8mb4;

CREATE TABLE IF NOT EXISTS tag(
  tagID INT UNSIGNED NOT NULL AUTO_INCREMENT,
  description VARCHAR(45) NOT NULL , 
  PRIMARY KEY (tagID)
) ENGINE=INNODB CHARACTER SET utf8mb4;

CREATE TABLE IF NOT EXISTS tagmap (
  excerptID INT UNSIGNED NOT NULL, 
  tagID INT UNSIGNED NOT NULL, 
  PRIMARY KEY (excerptID, tagID),
    CONSTRAINT excerptFK FOREIGN KEY (excerptID) REFERENCES excerpt (excerptID)
    ON DELETE CASCADE 
    ON UPDATE CASCADE,
    CONSTRAINT tagFK FOREIGN KEY (tagID) REFERENCES tag (tagID)
    ON DELETE CASCADE 
    ON UPDATE CASCADE
) ENGINE=INNODB;

根据description参数,我需要返回与绑定到该描述的所有摘录相关的所有标记描述。举个例子,如果我有四个摘录

代码语言:javascript
复制
Excerpt(1, aaaa , aaaa, aaaa, aaaa) bound via tagmap to tags (A, B, C)
Excerpt(2, bbbb, bbbb, bbbb, bbbb) bound via tagmap tags (A, D)
Excerpt(3, cccc, cccc, cccc, cccc) bound via tagmap to tag (B)
Excerpt(4, dddd, ddddd, dddd, dddd) bound via tagmap to tags (B, D)

而我的参数是"B",我想返回一个excerptID和描述的列表:

代码语言:javascript
复制
[Tag [excerptID=1, description=A], Tag [excerptID=1, description=B], Tag [excerptID=1, description=C], Tag [excerptID=3, description=B], Tag [excerptID=4, description=B], Tag [excerptID=4, description=D]]

到目前为止,我有这个

代码语言:javascript
复制
String SQL = "SELECT e.excerptID, t.description from Excerpt AS e LEFT JOIN tagmap AS m ON m.excerptID = e.excerptID LEFT JOIN tag AS t ON t.tagID = m.tagID WHERE t.description = ?";

但这只会返回以下内容

代码语言:javascript
复制
 [Tag [excerptID=1, description=B], Tag [excerptID=3, description=B], Tag [excerptID=4, description=B]]

我不知道如何继续下去。

EN

回答 1

Stack Overflow用户

发布于 2020-07-23 21:42:11

基于description参数,我需要返回与绑定到该描述的所有摘录相关的所有标记描述。举个例子,如果我有四个摘录

我相信这就是你想要的:

代码语言:javascript
复制
select t.*
from tags t
where exists (select 1
              from tagmap tm1 join
                   tagmap tm2
                   on tm1.excerptid = tm2.excerptid join
                   tags t2
                   on tm2.tagid = t.tagid
              where tm1.tagid = t.tagid and
                    t2.description = ?
             );

这看起来很复杂--也许是因为它确实如此。但是子查询基本上获得了附加到同一实体的所有标签对。有一个标记(在tm2上)与您关心的描述绑定在一起。这就是where子句中的t2.description = ?

另一个绑定到外部表中的标记。这就是关联子句tm1.tagid = t.tagid

另一种表达方式是这个查询(基本上是子查询):

代码语言:javascript
复制
select distinct tm1.tagid
from tagmap tm1 join
     tagmap tm2
     on tm1.excerptid = tm2.excerptid join
     tags t2
     on tm2.tagid = t.tagid
 where t2.description = ?

返回实体上的所有标记,该实体也具有您要查找的标记。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63055571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档