mysql - 嵌套表产品查询mysql

标签 mysql database performance nested

我有以下数据库结构,尽管我的数据库不是很大,但我想采用单一查询方法来显示任何给定节点或叶中的产品。 当前数据库具有与叶以及包含其他子项的节点相关联的产品(请参阅产品 3 和 4)。 我想列出的是属于 $_GET['node'] 包含的节点和子节点的所有产品,其中节点可以是根节点、叶节点或任何其他子节点父节点。

+---------+-----+-----+---------+
| tree_id | lft | rgt |  name   |
+---------+-----+-----+---------+
|       1 |   1 | 138 | TV's    |
|       2 |   2 |  91 | Phones  |
|       3 |   3 |  26 | Samsung |
|       4 |   4 |  10 | Used    |
|       5 |  11 |  25 | New     |
|       6 |  27 |  45 | Apple   |
|       7 |  46 |  90 | Philips |
|       8 |  47 |  51 | Touch   |
|       9 |  52 |  89 | Key     |
|         |     |     |         |
+---------+-----+-----+---------+

+------------+-------------+-------+
| product_id |    Name     | make  |
+------------+-------------+-------+
|          1 | Touch Easy  | 4466  |
|          2 | Eagle Eye   | 5523  |
|          3 | Super Phone | 7Utt  |
|          4 | Crazy Touch | Utiir |
+------------+-------------+-------+

+------------+--------+
| product_id | cat_id |
+------------+--------+
|          1 |      5 |
|          2 |      8 |
|          3 |      2 |
|          4 |      3 |
+------------+--------+

我不太熟悉复杂的查询,因此,我为获取节点 (2) 内的所有产品所做的工作是:

   $node = SELECT * FROM `categories` WHERE `id` = 2 
    $products = SELECT products_categories.id 
FROM `products_categories`, `categories` 
WHERE `categories`.`left` > ".$node['left']." 
AND `categories`.`right` < ".$node['right']." 
AND `products_categories`.`cat_id` = `categories`.`id` 

    foreach($products as $product){

    $prod = new Product($prod['id'])


    }

如您所见,我正在执行三个查询(一个在类中),我确信这不是最佳方法。

最佳答案

这种嵌套集模型比通常的相邻模型更复杂,尤其是在数据操作部分,但选择速度非常快。

无论如何,通过简单的谷歌搜索,您可能会找到可以帮助您轻松完成任务的开源类。

这样的一个是:https://github.com/riquito/Baobab

我使用的搜索关键词是:github nested set model php mysql

编辑:

对于您的特定情况,这样的查询可能有效:

SET @cid := 2;
SET @lft := (SELECT `lft` FROM `categories` WHERE `id` = @cid);
SET @rgt := (SELECT `rgt` FROM `categories` WHERE `id` = @cid);

SELECT `pc`.`productID`
  FROM `products_categories` `pc`
    LEFT JOIN `categories` `c` ON `c`.`id` = `pc`.`categoryID`
  WHERE `c`.`lft` > @lft
    AND `c`.`rgt` < @rgt
;

关于mysql - 嵌套表产品查询mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36446359/

相关文章:

regex - 使用正则表达式和通配符查询任意数据

python - 高效求解大量线性最小二乘系统

mysql - EF Core 在 Controller 中添加同一对象的两个实例 System.InvalidOperationException

mysql - 按多列分组并标记唯一的子组

database - 整洁架构 : Sequence Flow Among Frameworks

sql - 如何在表格中找到一系列没有间隙的序列号

mysql - 无论如何,始终为 mysql 列返回 null/空值并考虑到性能?

mysql - Laravel查询获取最大金额的前10条记录

angular - 来自数据库的内容的 ng-bootstrap 弹出窗口

python - numpy 例程似乎没有那么快