2016-04-06 6 views
1

私は以下のデータベース構造を持っています。データベースはそれほど大きくはありませんが、任意のノードまたはリーフに製品を表示するための単一のクエリメソッドを採用したいと考えています。 現在のデータベースには、リーフに関連する製品と、他の子を含むノードがあります(製品3と4を参照してください)。 私がリストしたいのは、$ _GET ['node']に含まれるノードと子に属するすべての製品です。ここで、nodeはルート、リーフ、または他の子の親になります。ネストしたテーブルの製品クエリmysql

+---------+-----+-----+---------+ 
| 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']) 


    } 

、私は3を実行しています私が確信しているクエリ(クラス内の1つ)は、最良のアプローチではありません。

+1

リストあなたの期待した結果とあなたが試したこと –

答えて

0

このネストされたセットモデルは、特にデータ操作部では通常の隣接モデルよりも複雑ですが、選択は非常に高速です。

とにかく簡単なGoogle検索では、簡単にタスクを達成するためのオープンソースのクラスが見つかるかもしれません。

ようなものである:私が使用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 
; 
関連する問題