MySQL - 三表标记结构 - 有效地从查询中获取标记名称和计数

时间:2013-09-19 14:53:34

标签: php mysql sql tags

我有一个非常标准的3表标记架构,我有一个名为content的表,其中包含titlesubtitletext等字段,名为tag的表格包含idname的字段,以及一个名为content_tag的表格,用于将字段content_idtag_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

0 个答案:

没有答案