一个显示项目标签的查询

tcomlyy6  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(400)

我在将两个查询合并为一个查询时遇到问题。我的示例数据库如下所示:https://www.db-fiddle.com/f/b2hsqiqzfqrdhrxzrmm49m/4
我想给出与第一个查询及其标记匹配的所有项目:
标题、说明、标签//链接中的查询#3
我遇到的主要问题是从一个查询到另一个查询的数据传输。item.iditem=112,其中112是来自第一个查询的idit。我的尝试:

  1. SELECT title, description, i.idItem
  2. FROM tags t INNER JOIN
  3. itemtags it
  4. ON t.idTag = it.idtag INNER JOIN
  5. item i ON it.idItem = i.idItem
  6. WHERE t.name = "java";
  7. SELECT GROUP_CONCAT(`Name`) as tags
  8. FROM tags
  9. WHERE idtag IN ( SELECT it.idtag FROM itemtags it,tags t WHERE it.idtag=t.idtag AND it.iditem = 112);
  10. SELECT *
  11. FROM (SELECT title, description FROM tags t INNER JOIN itemtags it ON t.idTag = it.idtag INNER JOIN item i ON it.idItem = i.idItem WHERE t.name = "java") as x,
  12. (SELECT GROUP_CONCAT(`Name`) as tags FROM tags JOIN itemtags ON tags.idtag = itemtags.idtag INNER JOIN item ON itemtags.iditem = item.iditem AND item.iditem = 112) as y;
mdfafbf1

mdfafbf11#

以下是我的尝试:
它显示每个项目的标题和描述,其中有一个名为“java”的标记,还有一列包含为该项目记录的所有标记的串联。
可以更改条件标记名称 "java" 到其他名称,通过更改条件来显示具有特定标记的项 WHERE t.name="java"WHERE t.name="frontend" 例如。
注意:我必须使用 DISTINCT 在外太空的开始 SELECT 查询和内部 GROUP_CONCAT 函数忽略中的重复记录 itemtags 您提供的示例数据库中的表。
我也在db fiddle中测试了查询:https://www.db-fiddle.com/f/b2hsqiqzfqrdhrxzrmm49m/13

  1. SELECT DISTINCT itemDetails.title, itemDetails.description, allTags.allTags_tags as tags
  2. FROM item
  3. INNER JOIN (
  4. SELECT i.iditem, i.title, i.description
  5. FROM item i
  6. inner join itemtags it
  7. on i.iditem = it.iditem
  8. inner join tags t
  9. on it.idtag = t.idtag
  10. WHERE t.name="java"
  11. ) as itemDetails
  12. ON itemDetails.iditem = item.iditem
  13. INNER JOIN (
  14. SELECT i.iditem as allTags_iditem, GROUP_CONCAT(DISTINCT t.name) as allTags_tags
  15. FROM item i
  16. inner join itemtags it
  17. on i.iditem = it.iditem
  18. inner join tags t
  19. on it.idtag = t.idtag
  20. GROUP BY it.iditem
  21. ) as allTags
  22. ON itemDetails.iditem = allTags.allTags_iditem;
展开查看全部
ih99xse1

ih99xse12#

我将用ids展示逻辑。您可以填写查询的其余部分来处理带有附加联接的名称。
其思想是自连接,然后聚合。关键是要计算匹配标签的数量,看看匹配的数量是否涵盖了所讨论项目的所有标签:

  1. select it.idItem
  2. from itemtags it join
  3. itemtags itj
  4. on it.idtag = itj.idtag and itj.iditem = 112
  5. group by it.idItem
  6. having count(*) = (select count(*)
  7. from itemtags itj
  8. where itj.idItem = 112
  9. );

相关问题