MySQL与多对多关系的限制

apg*_*apg 2 mysql database tags tagging

给出用于实现标签的SCHEMA

ITEM ItemId,ItemContent

标签TagId,TagName

ITEM_TAG ItemId,TagId

在使用标签选择时,限制返回的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 
Run Code Online (Sandbox Code Playgroud)

当然是最简单的方法可以让他们全部回来,但是使用限制子句会分解,因为你得到了每个标签的所有项目的副本,这些项目都计入LIMIT中的行数.

Bil*_*win 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;
Run Code Online (Sandbox Code Playgroud)

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