回答

收藏

选择类别属于层次结构中任何类别的产品

技术问答 技术问答 300 人阅读 | 0 人回复 | 2023-09-14

我有一个包含一个类别的FK的产品表,创建类别表的方式是每个类别都可以有一个父类别,例如:
4 c" x9 U- J  g. w0 [+ kComputers. {4 O" t& ?8 U1 a8 {# @" w
    Processors
" F. W" I3 H% A! O3 Q+ ~        Intel% B% q! H8 r- t' ^0 ?
            Pentium
: e) X6 u! R; I, U" S% O            Core 2 Duo7 ]. s4 e2 K3 ?$ j
        AMD
, p' ~8 d' m' A6 Y: m            Athlon9 t% I% _; W2 n, Z. I3 M
我需要进行选择查询,如果选择的类别是“处理器”,它将返回英特尔,奔腾,Core 2 Duo,AMD等产品。* T5 q* R4 @* d
我考虑过要创建某种“缓存”,该缓存将为数据库中的每个类别存储层次结构中的所有类别,并在where子句中包含“ IN”。这是最好的解决方案吗?. b- R0 U$ T: w
                + O" u( X( p3 ^% Q/ S
解决方案:) ^' G- o4 @. O/ e' f1 I
                + y( j2 |3 k! L1 s9 }* M. i

* O6 R6 ?$ P5 ], A5 M/ l$ V1 D" t
                最好的解决方案是在数据库设计阶段。您的类别表必须是一个 嵌套集
) T+ H# h  O0 z0 X# G! w。文章“在MySQL中管理层次结构数据”不是特定于MySQL的(尽管有标题),并且全面概述了在数据库表中存储层次结构的不同方法。
  k+ I: }/ ~5 _; d; h9 r; U& M; x执行摘要:7 ]0 z# g+ F4 s# K) J6 J$ O
嵌套集8 t: V8 k' b3 |- x5 f, L
任何深度的选择都很容易( h9 [$ q9 A7 K2 g% |9 _3 M
插入和删除很难4 _& C8 }2 d# \' w$ A) |
: q% ^6 Y7 g5 u3 j6 x' |, h
基于标准parent_id的层次结构3 C3 M" I& s9 U1 P# X, S( p& c
选择是基于内部联接的(因此可以快速获得毛发)
- E$ ], B$ ?. m5 m插入和删除都很容易
9 g$ U; N( k! f, M

2 b# I3 W+ t8 C) j% _! q因此,根据您的示例,如果层次结构表是嵌套集,则查询将如下所示:
* I4 g& v% r# m9 _# B1 J  |9 ^SELECT * FROM products
) U! K$ L( u5 M5 S$ H) d  T$ D0 C   INNER JOIN categories ON categories.id = products.category_id
5 P& ]) ~6 n  |) S: r+ j) FWHERE categories.lft > 2 and categories.rgt 2和11分别是Processors记录的左侧和右侧。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则