Получение блоков страницы - PullRequest
0 голосов
/ 12 марта 2011

У меня есть три таблицы: страницы, блоки и 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 для захвата "левого" и«правильные» блоки для конкретной страницы?

Ваша помощь очень ценится.

Ответы [ 2 ]

1 голос
/ 12 марта 2011

Вы можете использовать СОЮЗ:

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'
1 голос
/ 12 марта 2011

Один из двух вариантов - поиск влево и вправо:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...