gpt4 book ai didi

SQLite,多对多关系,如何聚合?

转载 作者:行者123 更新时间:2023-12-03 18:26:05 25 4
gpt4 key购买 nike

我在像使用 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 中的每一行?从性能的角度来看,这样做是明智的看法?或者我需要使用对数据库的更简单请求在应用程序代码中完成这种“演示”工作?

最佳答案

回答您的代码问题:

SELECT
c.CardId,
c.Text,
GROUP_CONCAT(t.Name,', ') AS TagsList
FROM
Cards c
JOIN CardsRelatedToTags crt ON
c.CardId = crt.CardId
JOIN Tags t ON
crt.TagId = t.TagId
WHERE
c.CardId = 1
GROUP BY c.CardId, c.Text

现在,关于性能问题。数据库是一个强大的工具,不会以简单的 SELECT 语句结束。你绝对可以在数据库(甚至是 SQLite)中做你需要的事情。将 SELECT 语句用作另一个 SELECT 中的一列的提要是一种不好的做法。这将需要扫描表格以获得输入中每一行的结果。

关于SQLite,多对多关系,如何聚合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29631577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com