mysql - 获取页面 block

标签 mysql sql many-to-many

我有三个表:pages、blocks和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
);

获取特定页面的“左”和“右” block 的完美 SQL 代码是什么?

非常感谢您的帮助。

最佳答案

一种方法是左右搜索两个连接:

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

编辑:如果可以有多个“右”和“左” block ,您可以查询所有 block ,例如:

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

关于mysql - 获取页面 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5281635/

相关文章:

python - 如何使用Python执行MariaDB数据库插入?

mysql - codeigniter 和 mysql 用户定义的变量不起作用

python - Python 中的 Flask 分页帮助

SQL Server 'In' 语句项性能顺序

entity-framework - 单个实体上的 EF 多对多

ruby-on-rails - rails : How to create a new entry in the join table

java - hibernate -级联类型持续存在多对多关系

php - 使用 PHP 发送一封电子邮件,其中包含从数据库中获取的信息

php - 使用 PHP 跳过第一行将 csv 上传到 mysql

MySQL-一次更新记录组