1

我已经看这个太久了,我的大脑感觉就像意大利面条。有人可以帮我解决几个问题吗?

Presentation
------------
id          int 
name        varchar 
fk_template int     (references template.id)

Template
--------
id          int 
name        varchar 

Position
--------
id          int 
zorder      int     (if it is the 1st, 2nd, 3rd position of the given template)
fk_template int     (references Template.id)

Asset
-----
id          int 
name        varchar 
description varchar 

AssetForPresentation
--------------------
fk_asset        int  (references Asset.id)
fk_presentation int  (references Presentation.id)
fk_position     int  (references Position.id)

认为此时我需要问的基本上是“给我所有的资产和他们在这个模板中的位置”。

你看,当一个 Presentation 被带来时,它有一个特定的 Template。每个模板都有指定的 Positions,每个 Position 都持有一个 Asset 或 NULL。

我需要能够为演示文稿使用的特定模板引入所有资产及其各自的位置。我将如何查询类似的东西?

我希望这对你有意义。

4

2 回答 2

2

根据您在问题中描述的内容,您需要获取给定模板的所有资产。我已经创建了表结构,但没有在表上定义关系约束,而是在制定查询时使用了它们。

您可以将Asset表连接到AssetForPresentation表。通过 AssetForPresentation 表,可以加入PresentationPosition表。Template可以通过Position表来建立与 的关系。因此,将Template表连接到Asset表以获取所有匹配的记录。

您可以在下面的链接中查看演示。

单击此处查看 SQL Fiddle 中的演示。

希望有帮助。

脚本:

CREATE TABLE Presentation
(
        id          INT         NOT NULL AUTO_INCREMENT
    ,   name        VARCHAR(30) NOT NULL
    ,   PRIMARY KEY (id)
);

CREATE TABLE Template
(
        id          INT         NOT NULL AUTO_INCREMENT
    ,   name        VARCHAR(30) NOT NULL
    ,   PRIMARY KEY (id)
);

CREATE TABLE Position
(
        id          INT         NOT NULL AUTO_INCREMENT
    ,   zorder      INT         NOT NULL 
    ,   fk_template INT         NOT NULL 
    ,   PRIMARY KEY (id)
);

CREATE TABLE Asset
(
        id          INT         NOT NULL AUTO_INCREMENT
    ,   name        VARCHAR(30) NOT NULL
    ,   description VARCHAR(30) NOT NULL
    ,   PRIMARY KEY (id)
);

CREATE TABLE AssetForPresentation
(
        fk_asset        INT         NOT NULL
    ,   fk_presentation INT         NOT NULL
    ,   fk_position     INT         NOT NULL
);

INSERT INTO Presentation (name) VALUES
    ('presenation 1'),
    ('presenation 2');

INSERT INTO Template (name) VALUES
    ('template 1'),
    ('template 2');

INSERT INTO Position (zorder, fk_template) VALUES
    (1, 1),
    (2, 2);

INSERT INTO Asset (name, description) VALUES
    ('asset 1', 'asset description 1'),
    ('asset 2', 'asset description 2');

INSERT INTO AssetForPresentation (fk_asset, fk_presentation, fk_position) 
VALUES
    (1, 1, 1),
    (1, 2, 1),
    (2, 2, 1),
    (2, 2, 2);

SELECT              *
FROM                Asset A
RIGHT OUTER JOIN    AssetForPresentation AP
ON                  A.id = AP.fk_asset
RIGHT OUTER JOIN    Presentation P
ON                  P.id = AP.fk_presentation
RIGHT OUTER JOIN    Position PO
ON                  PO.id = AP.fk_position
RIGHT OUTER JOIN    Template T
ON                  T.id = PO.fk_template
WHERE               T.id = 1;

输出

ID NAME    DESCRIPTION         FK_ASSET FK_PRESENTATION FK_POSITION ZORDER FK_TEMPLATE
-- ------- ------------------- -------- --------------- ----------- ------ -----------
1  asset 1 asset description 1    1            1            1          1        1
1  asset 1 asset description 1    1            2            1          1        1
2  asset 2 asset description 2    2            2            1          1        1
于 2012-04-28T21:28:36.113 回答
2

我认为您遇到困难的部分是桌面上JOIN的两个条件。AssetForPresentation

SELECT
  a.id,
  a.name,
  a.description
FROM Presentation AS p
JOIN Template AS t
  ON p.fk_template = t.id
LEFT JOIN Position AS pos
  ON pos.fk_template = t.id
LEFT JOIN AssetForPresentation AS afp
  ON afp.fk_presentation = p.id
  AND afp.fk_position = pos.id
LEFT JOIN Asset AS a
  ON a.id = afp.fk_asset
WHERE p.id = 123
ORDER BY pos.zorder ASC
于 2012-04-28T21:30:40.870 回答