2011-03-12 53 views
0

我有三個表格:頁面,塊和pages_blocks。獲取頁面塊

我的數據庫架構看起來如下:

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只返回一個排的優勢。

編輯:如果可以有多個 「右」 和 「左」 的塊,你可以查詢所有塊,如:

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,我當我有一個以上的塊時,我會在同一頁面上獲得兩行。這是爲什麼? – emurad 2011-03-12 10:07:59

+0

@emurad:SQL無法返回動態數量的列,因此如果可以有多個「左」塊,則最佳選項是每塊有一行。我在答案的底部添加了一種方法來做到這一點。 – Andomar 2011-03-12 10:12:10

+0

我接受了解決方案。謝謝。 – emurad 2011-03-12 14:12:37

1

你可以使用UNION:

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'