我正在努力解决一个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子句时,它会选择正确的行,但不包括其他标记(如预期的那样)。
有人可以帮我吗?非常感谢你。
答案 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子句的多个标签时,其标签名称将连接多次。