2011-03-12 8 views
0

페이지, 블록 및 페이지 _ 블록의 세 가지 테이블이 있습니다.페이지 블록 가져 오기

내 데이터베이스 스키마는 다음과 같습니다

CREATE TABLE `blocks` (
    `id` smallint(6) NOT NULL AUTO_INCREMENT, 
    `name` char(40) NOT NULL, 
    `content` text NOT NULL 
    PRIMARY KEY (`id`) 
); 

CREATE TABLE `pages` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `title` char(100) NOT NULL, 
    `content` mediumtext NOT NULL 
    PRIMARY KEY (`id`) 
); 

CREATE TABLE `pages_blocks` (
    `page_id` int(11) DEFAULT NULL, 
    `block_id` smallint(6) DEFAULT NULL, 
    `location` enum('left','right') DEFAULT NULL, 
    `display_order` smallint(6) DEFAULT NULL 
); 

어떤 특정 페이지의 "왼쪽"과 "오른쪽"블록을 잡기 위해 완벽한 SQL 코드를 것입니까?

귀하의 도움에 감사드립니다.

답변

1

한 가지 방법은 두 가지가 좌우들을 검색 조인 될 것이다 :

select * 
from pages p 
left join 
     (
     select * 
     from pages_blocks pb 
     join blocks b 
     on  pb.block_id = b.id 
     where pb.location = 'left' 
     ) left_block 
on  left_block.page_id = p.id 
left join 
     (
     select * 
     from pages_blocks pb 
     join blocks b 
     on  pb.block_id = b.id 
     where pb.location = 'right' 
     ) right_block 
on  right_block.page_id = p.id 
where p.id = 42 

group by를 사용하지 않고 하나의 행을 반환하는 장점이있다.

편집 : 당신은 UNION 사용할 수

select pb.location 
,  pb.display_order 
,  b.name 
,  b.content 
from pages p 
join pages_blocks pb 
on  pb.page_id = p.id 
join blocks b 
on  pb.block_id = b.id 
where p.id = 42 
order by 
     pb.location 
,  pb.display_order 
+0

안녕 Andomar를 I 한 페이지에 두 개 이상의 블록이있을 때 같은 페이지에 대해 두 개의 행이 표시됩니다. 왜 그런가요? – emurad

+0

@emurad : SQL은 동적 개수의 열을 반환 할 수 없으므로 "왼쪽"블록이 여러 개있을 수있는 경우 가장 좋은 옵션은 블록 당 하나의 행입니다. 나는 대답의 맨 아래에 그것을 할 길을 추가했다. – Andomar

+0

해결책을 수락했습니다. 감사. – emurad

1

: 복수의 "오른쪽"과 "왼쪽"블록이 될 수 있다면, 당신은 같은 모든 블록을 조회 할 수

select a.content 
from blocks a, pages_blocks b 
where a.id=b.block_id and b.page_id=123 and b.location='left' 
union 
select a.content 
from blocks a, pages_blocks b 
where a.id=b.block_id and b.page_id=123 and b.location='right' 
관련 문제