我有一个非常标准的 3 表标记架构,其中我有一个以content
字段命名的表,例如title
, subtitle
,text
等,一个以tag
字段命名的表id
and name
,以及一个名为content_tag
将两者与字段content_id
和连接起来的表tag_id
。
我允许用户通过标签和关键字进行搜索。对此的查询如下所示:
SELECT *
FROM content_tag ct, content c, tag t
WHERE ct.tag_id = t.id
AND (t.name IN ('Metal Joints','Joint Set'))
AND c.id = ct.content_id
AND (c.title like '%Te%' or c.subtitle like '%Te%' or c.text like '%Te%' or c.keywords like '%Te%' )
GROUP BY c.id HAVING COUNT( c.id )=2
ORDER BY add_date DESC
此查询选择同时具有标签“ Metal Joints
”和“ ”且Joint Set
还包含“ %Te
”的所有内容。它运作良好,不是我的问题。
我的问题是尝试有效地从此查询中获取所有标签名称及其计数。我用子查询WHERE IN
语句尝试了这个,但它们需要 3-5 秒才能完成。
我需要帮助创建一个查询,该查询将为我提供上述查询生成的表中包含的标签名称和计数列表。如果不花太长时间,我似乎无法做到。
编辑:这是我现在使用的查询,需要几秒钟,但有效。
SELECT tag.name, COUNT(tag.id) as tagCount
FROM content_tag
LEFT JOIN tag
ON content_tag.tag_id = tag.id
WHERE content_tag.content_id IN
(SELECT c.id
FROM content_tag ct, content c, tag t
WHERE ct.tag_id = t.id
AND (t.name IN ('Metal Joints','Joint Set'))
AND c.id = ct.content_id
AND (c.title like '%Te%' or c.subtitle like '%Te%' or c.text like '%Te%' or c.keywords like '%Te%' )
GROUP BY c.id HAVING COUNT( c.id )=2
ORDER BY add_date DESC)
GROUP BY tag.id