【问题标题】:One query to display tags for item一个查询来显示项目的标签
【发布时间】:2018-04-14 11:38:56
【问题描述】:

我在将两个查询合并为一个时遇到问题。我的示例数据库如下所示: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;

【问题讨论】:

    标签: mysql sql database database-design tags


    【解决方案1】:

    这是我的尝试:

    它显示每个具有名为“java”的标签的项目的标题描述,以及包含为该项目记录的所有标签的串联的列.

    您可以将条件标签名称"java"更改为其他名称,以显示具有特定标签的项目,例如将条件WHERE t.name="java"更改为WHERE t.name="frontend"

    注意:我必须在外部SELECT 查询的开头和GROUP_CONCAT 函数内部使用DISTINCT 来忽略示例数据库中itemtags 表中的重复记录你提供的。

    我也在 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;
    

    【讨论】:

      【解决方案2】:

      我将仅使用 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
                        );
      

      【讨论】:

      • 感谢您的回答,不幸的是,我不太明白。我给出的数据是“java”,第一个查询必须定义112。 112 号码只是在链接中发出请求的一个示例。我不太明白您的查询将如何引导我找到解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-04
      • 2017-02-27
      • 2014-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多