0

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

一,'domains',存储唯一的域名,这是'父'表到第二个表,'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 子句时,WHERE ut.tag_id = 7它会选择正确的行,但不包括其他标签(如预期的那样)。

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

4

2 回答 2

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
于 2013-09-10T06:00:19.247 回答
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 子句中的多个标签时,它的标签名称将被连接多次。

于 2013-09-10T15:25:07.083 回答