MySQL连接查询结果按标签过滤

时间:2013-09-10 05:56:36

标签: mysql join grouping where-clause

我正在努力解决一个MySQL查询,我可以搞清楚。我有三个表格,其中包含有关网址的信息。

一个'域名',存储唯一的域名,即父母'表到第二个表,' urls',存储具有一些统计信息的唯一网址名称。可以为每个网址记录添加多个标记,这些标记存储在“标记”中。表格,当然还有网址和标签之间的连接表,名为' url_has_tag'。

我有查询为所有网址记录选择域名,网址统计信息和连接标记:

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

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

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

有人可以帮我吗?非常感谢你。

2 个答案:

答案 0 :(得分:0)

通过在左外连接的右侧表中添加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

答案 1 :(得分:0)

感谢朋友解决了!

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子句的多个标签时,其标签名称将连接多次。