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)

この時点で私が尋ねる必要があると思うのは、基本的に「このテンプレートのすべてのアセットとその位置を教えてください」ということです。

ご覧のとおり、プレゼンテーションが持ち込まれると、特定のテンプレートがあります。各テンプレートには指定されたポジションがあり、各ポジションはアセットまたは 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

あなたが苦労している部分はJOINAssetForPresentationテーブルに2つの条件があると思います.

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 に答える