0

ねえ、私は次を使用してmysqlテーブルにツリーを実装しました:

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

これは、次のようなテーブルがある場合の方法です。

+-------------+----------------------+-----+-----+
| category_id | name                 | lft | rgt |
+-------------+----------------------+-----+-----+
|           1 | ELECTRONICS          |   1 |  20 |
|           2 | TELEVISIONS          |   2 |   9 |
|           3 | TUBE                 |   3 |   4 |
|           4 | LCD                  |   5 |   6 |
|           5 | PLASMA               |   7 |   8 |
|           6 | PORTABLE ELECTRONICS |  10 |  19 |
|           7 | MP3 PLAYERS          |  11 |  14 |
|           8 | FLASH                |  12 |  13 |
|           9 | CD PLAYERS           |  15 |  16 |
|          10 | 2 WAY RADIOS         |  17 |  18 |
+-------------+----------------------+-----+-----+

通常どおり表を印刷するには、lft 列で並べ替えます。逆に注文する簡単な方法はありますか、または同じ「深さ」のすべてのエントリがコスト順に並べられる「コスト」のような別の列がありますか?

ありがとう

4

1 に答える 1

0

引用するURLSELECTは、深さを与えるaを取得する方法を示しています。それを別のURLにネストする場合はSELECT、必要に応じて注文できます。例えば:

SELECT thename, thedepth
FROM (
  SELECT node.name AS thename, (COUNT(parent.name) - 1) AS thedepth
  FROM nested_category AS node,
  nested_category AS parent
  WHERE node.lft BETWEEN parent.lft AND parent.rgt
  GROUP BY node.name
  ORDER BY node.lft) plain
ORDER BY thedepth DESC;

同様に、もちろん、あなたはnode.cost AS thecost内側SELECTにもそれを持っていたり、外側にそれをSELECT持っていたりすることができますORDER BY thedepth DESC, thecost ASC

パフォーマンスはまともな場合とそうでない場合がありますが、実際に判断できるのは、試してみて(そしてEXPLAIN SELECT、適切なインデックスを追加することによってのみです;-)。

十分にスマートなDBエンジンを使用している場合は、ネストは必要ありません。ORDER BY計算列を直接実行できます(ここにthedepthあります)。しかし、このソリューションは、より多くの/古いDBエンジン/バージョンで機能すると思います。

于 2009-06-15T00:09:54.443 に答える