我将两个查询合并为一个问题。我的示例数据库如下所示:https://www.db-fiddle.com/f/b2hsQiqzfqrDhRXzRmM49m/4
我想提供与第一个查询及其标记匹配的所有项目:
标题,描述,标签//链接中的查询#3
我遇到问题的主要问题是将数据从一个查询传输到另一个查询。 item.iditem = 112,其中112是第一个查询的idit。我的尝试:
SELECT title, description, i.idItem
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";
SELECT GROUP_CONCAT(`Name`) as tags
FROM tags
WHERE idtag IN ( SELECT it.idtag FROM itemtags it,tags t WHERE it.idtag=t.idtag AND it.iditem = 112);
SELECT *
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,
(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;
答案 0 :(得分:1)
这是我的尝试:
它显示每个项目的标题和描述,其中包含名为" java"的标记,以及包含所有标记的列的列为该项目记录的标签。
您可以将条件标记名称"java"
更改为其他名称,以通过将条件WHERE t.name="java"
更改为WHERE t.name="frontend"
来显示具有特定标记的项目。
注意:我必须在外部DISTINCT
查询的开头使用SELECT
并在GROUP_CONCAT
函数内使用itemtags
忽略{{1}中的重复记录您提供的示例数据库中的表。
我在db-fiddle中测试了查询: https://www.db-fiddle.com/f/b2hsQiqzfqrDhRXzRmM49m/13
SELECT DISTINCT itemDetails.title, itemDetails.description, allTags.allTags_tags as tags
FROM item
INNER JOIN (
SELECT i.iditem, i.title, i.description
FROM item i
inner join itemtags it
on i.iditem = it.iditem
inner join tags t
on it.idtag = t.idtag
WHERE t.name="java"
) as itemDetails
ON itemDetails.iditem = item.iditem
INNER JOIN (
SELECT i.iditem as allTags_iditem, GROUP_CONCAT(DISTINCT t.name) as allTags_tags
FROM item i
inner join itemtags it
on i.iditem = it.iditem
inner join tags t
on it.idtag = t.idtag
GROUP BY it.iditem
) as allTags
ON itemDetails.iditem = allTags.allTags_iditem;
答案 1 :(得分:0)
我将使用id显示逻辑。您可以填写查询的其余部分来处理带有其他连接的名称。
这个想法是自我加入然后聚合。关键是要计算匹配标签的数量,以查看匹配数量是否涵盖相关项目的所有标签:
select it.idItem
from itemtags it join
itemtags itj
on it.idtag = itj.idtag and itj.iditem = 112
group by it.idItem
having count(*) = (select count(*)
from itemtags itj
where itj.idItem = 112
);