2011-03-12 119 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'