2012-04-28 2 views
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이 있습니다.

프리젠 테이션에서 사용하는 특정 템플릿에 대해 모든 자산 및 개별 위치를 가져올 수 있어야합니다. 어떻게 그런 질문을합니까?

나는 이것이 당신에게 의미가 있기를 바랍니다.

+0

무엇이 당신 질문입니까? – Hamish

+0

나는 이것을 어떻게 질문 할 것인가 ... 내가 쓴 것에 걸쳐 명확하게 엮여있는 것이 아니라,이 질문의 제목은 단순한 "SQL : 모든 자산과 그들의 위치 선택"을 말하고있다. "SQL"솔루션을 찾고 있다면 항상 "SQL"로 제목을 붙입니다. – dcolumbus

+0

메모 주셔서 감사합니다, @ 시바. – dcolumbus

답변

2

나는 당신이 힘든 시간을 보내고있는 부분은 AssetForPresentation 테이블 JOIN에 두 가지 조건이라고 생각합니다.

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 
+0

예, 저는 그 일로 가장 어려움을 겪고 있습니다. 나는 지금 당장 뒤죽박죽이다. 나는 무엇을 요구하고 있는지조차 모르겠다. :/ – dcolumbus

+0

@dcolumbus 그냥 내 쿼리가 작동하는지 확인한다. –

+0

결과가 약간 있습니다. 그리고 몇 가지 선택 필드에 "*"를 좁히려고하면 꽤 모호한 점이 있습니다. – dcolumbus

2

질문에 설명 된 내용에 따라 특정 템플릿에 대한 모든 애셋을 가져와야합니다. 테이블 구조를 만들었지 만 테이블에 관계 제약 조건을 정의하지는 않았지만 쿼리를 공식화하는 동안 사용했습니다.

Asset 테이블을 AssetForPresentation 테이블에 가입시킬 수 있습니다. AssetForPresentation 테이블을 통해 PresentationPosition 테이블을 조인 할 수 있습니다. Template에 대한 관계는 Position 테이블을 통해 만들 수 있습니다. 따라서 일치하는 모든 레코드를 가져 오려면 템플릿 테이블을 자산 집합 테이블에 추가하십시오.

아래 링크에서 데모를 볼 수 있습니다. 도움이

Click here to view the demo in 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 
+0

와우 ... 응답에 많은 노력을 기울여 주셔서 감사합니다. 거대한 도움이됩니다! 이걸 살펴보고 내가 여기서 뭘하고 있는지 이해할 수있게하겠습니다. 다시 감사합니다! – dcolumbus

+0

모든 조인은 'INNER JOIN'이므로 모든 위치에 항상 자산이 있다고 가정합니다. 그러나 어떤 위치에 자산이 없다면이 위치는 결과 집합에 나타나지 않습니다. OP의 요구 사항에 맞지 않는 것 같습니다. –

+0

글쎄, 결국, 나는 이것을 Array로 뷰에 표시 할 수 있기를 바랍니다. 배열을 반복 할 수 있고, 위치가'empty()'또는'NULL' 인 경우 괜찮을 것입니다 ... 그 레코드는'Save (저장)시'AssetForPresentation' 테이블에 생성되지 않을 것입니다)'... 그것은 논리적으로 보입니까? – dcolumbus

관련 문제