我有一个非常标准的3表标记架构,我有一个名为content
的表,其中包含title
,subtitle
,text
等字段,名为tag
的表格包含id
和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