【问题标题】:MySQL join query result filtered by tagsMySQL join 查询结果按标签过滤
【发布时间】:2013-09-10 05:56:36
【问题描述】:

我正在为一个 MySQL 查询而苦苦挣扎,但我可以弄清楚。我有三个表,其中包含有关 url 地址的信息。

一个,'domains',存储唯一的域名,它是'parent'表到第二个表,'urls',存储唯一的urls名称和一些统计信息。每个 url 记录可以添加多个标签,这些标签存储在 'tags' 表中,当然还有 url 和标签之间的连接表,称为 'url_has_tag'。

我的查询为所有 url 记录选择域名、url 统计信息和连接标签:

SELECT u.url_id, u.url, d.domain, u.hits, u.version, GROUP_CONCAT( t.label) as tags
     FROM urls AS u
     INNER JOIN domains AS d 
        ON (u.parent_id = d.domain_id) 
    LEFT JOIN url_has_tag AS ut ON u.url_id = ut.url_id 
    LEFT JOIN tags as t ON ut.tag_id = t.tag_id
GROUP BY u.url_id
ORDER BY u.hits DESC

现在我需要按标签添加过滤结果,这意味着我要选择选择相同的信息,但仅适用于带有某些标签的 url。它们也可以被其他标记,我希望结果中包含其他标记。

当我在分组 WHERE ut.tag_id = 7 之前添加 WHERE 子句时,它会选择正确的行,但不包括其他标签(如预期的那样)。

谁能帮我解决这个问题?非常感谢。

【问题讨论】:

    标签: mysql join grouping where-clause


    【解决方案1】:

    通过在左外连接的右侧表上添加where子句使其成为内连接。所以在join的ON子句中添加ut.tag_id = 7,如下所示。

    SELECT u.url_id, u.url, d.domain, u.hits, u.version, GROUP_CONCAT( t.label) as tags
     FROM urls AS u
     INNER JOIN domains AS d 
        ON (u.parent_id = d.domain_id) 
    LEFT JOIN url_has_tag AS ut ON u.url_id = ut.url_id and ut.tag_id = 7
    LEFT JOIN tags as t ON ut.tag_id = t.tag_id
    GROUP BY u.url_id
    ORDER BY u.hits DESC
    

    【讨论】:

    • 不起作用,从“urls”表中返回所有项目的行(所以没有过滤 - 我猜这是因为 LEFT JOIN 特性)并且“标签”的结果只包含标签id 为 7,而其他标签绑定到该 url。所以我将左连接更改为内连接,所以我至少只得到预期的行(标签信息不完整)
    【解决方案2】:

    感谢朋友解决!

    SELECT u.url_id, u.url, d.domain, u.hits, u.version, GROUP_CONCAT(DISTINCT(t2.label)) as tags
         FROM urls AS u
         INNER JOIN domains AS d
            ON (u.parent_id = d.domain_id)
         LEFT JOIN url_has_tag AS ut ON u.url_id = ut.url_id
         LEFT JOIN url_has_tag AS ut2 ON u.url_id = ut2.url_id
         LEFT JOIN tags as t ON ut.tag_id = t.tag_id
         LEFT JOIN tags as t2 ON ut2.tag_id = t2.tag_id
    WHERE t.tag_id IN (7,8)
    GROUP BY u.url_id
    ORDER BY u.hits DESC
    

    标签名称必须是 DISTINCT,因为当 url 匹配 WHERE .. IN 子句中的多个标签时,其标签名称将被连接多次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-15
      • 2017-12-15
      • 2017-09-27
      • 2020-06-10
      • 1970-01-01
      • 1970-01-01
      • 2016-09-10
      • 1970-01-01
      相关资源
      最近更新 更多