【发布时间】:2015-06-20 07:30:51
【问题描述】:
我在使用 SQLite 构建的小型闪存卡之类的应用程序中对多对多关系进行了经典安排。每张卡片可以有多个标签,每个标签可以有多个卡片。这两个实体各有一个表和第三个表来链接记录。
这是卡片表:
CREATE TABLE Cards (CardId INTEGER PRIMARY KEY AUTOINCREMENT,
Text TEXT NOT NULL,
Answer INTEGER NOT NULL,
Success INTEGER NOT NULL,
Fail INTEGER NOT NULL);
这是标签表:
CREATE TABLE Tags (TagId INTEGER PRIMARY KEY AUTOINCREMENT,
Name TEXT UNIQUE NOT NULL);
这是交叉引用表:
CREATE TABLE CardsRelatedToTags (CardId INTEGER,
TagId INTEGER,
PRIMARY KEY (CardId, TagId));
我需要在以逗号分隔的列中获取一张卡片表,其中包含相关标签。 我已经可以通过以下查询获得我需要的单行信息:
SELECT Cards.CardId, Cards.Text,
(SELECT group_concat(Tags.Name, ', ') FROM Tags
JOIN CardsRelatedToTags ON CardsRelatedToTags.TagId = Tags.TagId
WHERE CardsRelatedToTags.CardId = 1) AS TagsList
FROM Cards
WHERE Cards.CardId = 1
这将导致如下结果:
CardId | Text | TagsList
1 | Some specially formatted text | Tag1, Tag2, TagN...
如何获得这种类型的结果(来自 group_concat 的 TagsList)使用 SQL 查询为 Cards 中的每一行?从性能的角度来看,这样做是可取的看法?或者我需要使用对 DB 的更简单请求在应用程序代码中进行这种“演示”工作?
【问题讨论】:
标签: sql sqlite many-to-many group-concat