我正在开发一个应用程序来创建和管理背景音频。它由场景来表现。
每个场景都有一个介绍,背景音乐和氛围。我必须不同的音频类型,因为在我的应用程序中,他们被视为不同的,可以有自己的设置。此外,在列出场景时,我希望按标题显示当前场景中的每个音频类型。在我当前的概念中,我必须连接3个表并得到一个标题列表。
现在我´我一直在研究一个概念,但我不确定这是否是最好的方法。也许你能帮我优化一下。
数据库就是这样的:
CREATE TABLE scene (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
title TEXT NOT NULL,
intro INTEGER,
music INTEGER,
ambience INTEGER,
FOREIGN KEY (intro) REFERENCES audioInScene(id) ON DELETE CASCADE,
FOREIGN KEY (music) REFERENCES audioInScene(id) ON DELETE CASCADE,
FOREIGN KEY (ambience) REFERENCES audioInScene(id) ON DELETE CASCADE);
CREATE TABLE audioOpts (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
volume INTEGER NOT NULL,
repeat INTEGER NOT NULL);
CREATE TABLE audioFile (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
title TEXT NOT NULL,
path TEXT UNIQUE NOT NULL);
CREATE TABLE audioWithOpts (
id INTEGER PRIMARY KEY,
file INTEGER NOT NULL,
opts INTEGER NOT NULL,
FOREIGN KEY (file) REFERENCES audioFile (id),
FOREIGN KEY (opts) REFERENCES audioOpts (id) ON DELETE CASCADE);
CREATE TABLE audioInScene(
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
inScene INTEGER NOT NULL,
audio INTEGER NOT NULL,
tag TEXT NOT NULL,
FOREIGN KEY (inScene) REFERENCES scene (id) ON DELETE CASCADE,
FOREIGN KEY (audio) REFERENCES audioWithOpts (id) ON DELETE CASCADE
);
例如,这是一个join语句,我必须执行它来获得简介标题、音乐标题和氛围标题:
SELECT scene.title, audioFile.title
FROM scene
INNER JOIN audioInScene ON scene.intro=audioInScene.audio OR scene.music=audioInScene.audio OR scene.ambience=audioInScene.audio
INNER JOIN audioWithOpts ON audioInScene.audio=audioWithOpts.id
INNER JOIN audioFile ON audioWithOpts.file=audioFile.id
输出结果如下:
sceneTitle | introTitle
sceneTitle | musicTitle
sceneTitle | ambienceTitle
我如何创建我的概念来获得这样的输出
sceneTitle | introTitle | musicTitle | ambienceTitle
2条答案
按热度按时间2g32fytz1#
您可以使用sql server中的字符串\u agg来实现这一点。
yftpprvb2#
一个选项是执行3个连接,可以使用with删除重复。
另一个选项是使用查询和添加pivot根据标题将行转换为列。