MySQL 加入子类别

标签 mysql join union

我有类别和页面表。我的表结构是这样的:

第一页有三列

id | category_id | content
1         2        example page of subexample
2         1        example page of example

一类有四种

id | is_parent | parent | name
1       1         NULL    example
2       0          1      subexample

我想获取该类别的所有页面,如果是其父类别,我也想包括属于其子类别成员的页面。

根据我给出的示例,可以想象,当用户选择查看示例类别的全部内容时,我希望他看到示例的示例页面和子示例的示例页面。

$query = "SELECT * FROM `pages` WHERE `category_id` = :cid
union
select * from `pages` p
join `categories` k ON k.id = p.category_id
where k.parent = :cid";

我已经尝试过上面的代码,但对我不起作用。我也不确定我的逻辑。

最佳答案

你可以试试

SELECT * 
  FROM pages
 WHERE category_id IN
(
  SELECT c.id 
    FROM categories c LEFT JOIN categories p
      ON c.parent = p.id
   WHERE p.id = :cid OR c.id = :cid
)

SELECT * 
  FROM pages p
 WHERE category_id IN
(
  SELECT :cid
   UNION ALL
  SELECT id 
    FROM categories 
   WHERE parent = :cid
)

这里是SQLFiddle 演示

注意:它仅适用于一级深层含义类别及其子类别。如果一个子类别有其他子类别,那么您需要使用动态 SQL 来遍历类别树。

关于MySQL 加入子类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17798101/

相关文章:

Mysql 检查两列之间的日期并检查一列少的日期

mysql - 无法在 GROUP_CONCAT DERIVED 查询中选择 DISTINCT

Mysql case when 和 order by issue

大连接上的 MySQL 重复条目检测

mysql 将子查询保留在连接之外

MySQL 优化 UNION 查询

hadoop - Hive - 或条件与左外连接

mysql - 在给定时间范围内按小时分组

java - 字符串数组分割

c# - 什么是折叠一组潜在重叠范围的通用算法?