2

给定用于实现标签的 SCHEMA

项目项目 ID、项目内容

标记标记 ID、标记名称

ITEM_TAG 项目 ID、标签 ID

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

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 

当然是让它们全部恢复的最简单方法,但是使用限制子句会失效,因为您会得到每个标签的所有项目的副本,这会计入 LIMIT 中的行数。

4

4 回答 4

5

我的第二个解决方案使用 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 的一部分。

于 2008-10-03T16:03:57.587 回答
1

也许像

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
于 2008-10-03T14:31:49.957 回答
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 引擎应该把它分解出来并且只运行一次。

于 2008-10-03T15:59:59.857 回答
0

您还可以使用 Distinct/Group By:

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

于 2008-10-03T16:13:11.717 回答