2008-10-03 51 views
2

标签识别,标签名MySQL的限制与许多来给出模式实现标签</p> <p>项目 项目Id,ItemContent</p> <p>TAG许多关系

ITEM_TAG 项目Id,标签识别

什么选择标签时限制ITEMS返回数量的最佳方法是什么?

SELECT i.ItemContent, t.TagName FROM item i 
INNER JOIN ItemTag it ON i.id = it.ItemId 
INNER JOIN tag t ON t.id = it.TagId 

当然是让他们都回来了最简单的方法,但使用的限制条款坏了,因为你得到的所有项目对每个标签,这对在限行数计数的重复。

回答

4

我的第二个解决方案使用MySQL函数GROUP_CONCAT()将匹配项的所有标记组合到结果集中以逗号分隔的字符串中。

SELECT i.ItemContent, GROUP_CONCAT(t.TagName ORDER BY t.TagName) AS TagList 
FROM item AS i 
    INNER JOIN ItemTag AS it ON i.id = it.ItemId 
    INNER JOIN tag AS t ON t.id = it.TagId 
GROUP BY i.ItemId; 

GROUP_CONCAT()函数是一个MySQL特性,它不是标准SQL的一部分。

+0

GROUP_CONCAT正是会工作的解决方案。谢谢! – apg 2008-10-03 16:28:48

0

也许像

select i.ItemContent, t.TagName from (SELECT ItemId, ItemContent FROM item limit 10) i 
INNER JOIN ItemTag it ON i.ItemId = it.ItemId --You will miss tagless items here! 
INNER JOIN tag t ON t.id = it.TagId 
0

我的第一个建议是使用子查询,生成项目ID的列表,并返回项目符合这些项目的ID。但是这不包括结果集中的TagName。我会用另一个解决方案提交一个单独的答案。

SELECT i.ItemContent 
FROM item AS i 
WHERE i.id IN (
    SELECT it.ItemId 
    FROM ItemTag AS it 
    INNER JOIN tag AS t ON (t.id = it.TagId) 
    WHERE t.TagName IN ('mysql', 'database', 'tags', 'tagging') 
); 

这是一个不相关的子查询,所以一个好的SQL引擎应该将其排除并运行一次。

0

你也可以使用distinct /组方:

SELECT DISTINCT TagID, TagName FROM ((TAG T INNER JOIN ITEM_TAG I_T ON T.TagID = I_T.TagID) INNER JOIN ITEM I ON I_T.ItemID = I.ItemID) GROUP BY TagID, TagName