【问题标题】:How to select all articles from one category and sub-category In MySQL 5如何在 MySQL 5 中从一个类别和子类别中选择所有文章
【发布时间】:2016-09-03 13:54:28
【问题描述】:

三个表格保存文章信息:

分类表:

id, lft, rgt, title

lft: 左值

rgt: 正确的值

lft 和 rgt 的值是 Nested Set,例子:

           root 
          (0,15)
          /    \
         /      \
       cat1    cat2
      (1,6)   (7, 14) 
       /|      / | \
      / |     /  |  \
     /  |    /   |   \
 cat3 cat4  cat5 cat6 cat7
(2,3) (4,5) (8,9)(10,11)(12,13)

文章表:

id, title

article_category_map 表:

article_id, category_id

如何在MySQL中选择一个类别和子类别中的所有文章?

我希望:

1、点击cat2时,显示cat2和cat5和cat6和cat7的所有文章。

2、点击 cat5 时,只显示 cat5 的所有文章。

3、点击root,显示所有分类的所有文章(包括cat1、cat2、cat3、cat4、cat5、cat6、cat7...)。

【问题讨论】:

  • Whr 是您的子目录表,也将其发布。并且,您是要获取已知猫 ID 的数据还是要获取基于动态猫 ID 的数据?

标签: php mysql sql


【解决方案1】:

我猜 'lft' 和 'rgt' 代表 binary tree 的“左”和“右”属性。

假设 $category_id 是类别的 ID,Db::fetch 方法从数据库中获取单行,Db::fetchAll 方法获取与 SQL 查询匹配的所有行。

然后你可以获取分类的“左”和“右”,然后从分类及其子分类中获取文章。

if (! $cat = Db::fetch("SELECT lft, rgt
  FROM categories WHERE id = $category_id"))
{
  // handle error
}

$articles = Db::fetchAll("SELECT a.* FROM article a
  JOIN article_category_map m ON m.article_id = a.id
  JOIN categories c ON c.id = m.category_id
  WHERE c.id BETWEEN ${cat['lft']} AND {$cat['rgt']}");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 2015-01-13
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多