0

我正在努力理解 php/mysql 应用程序的自定义模式可以组合在 SELECT 查询中,但我不熟悉这种关系。我是一个新手程序员,缺乏描述这种关系的能力,以便在网上找到具体信息。我正在寻找一些伪代码或技术术语来设计这个模式。

它很简单,如下所示。我还尝试了将 SQL 命令作为伪代码通知的逻辑,这就是我解码的地方,我不得不寻求帮助 (9_9)

这是一个使用两个表的分类模式。第一个表包含术语和基于权重的顺序(从最低到最高)值。第二个表指定了第一个表的父子关系。有趣的是,第一个表中的子权重就像多维数组的第二个值,父权重m索引子权重n。类似于 taxonomy_term_weight [ m ][ n ]

table_a                table_b on table_a.ID 
+-----+------+-----+...+-----+ 
| ID  | TRM  | WT  |...| P   | 
+-----+------+-----+...+-----+ 
|1    |  3   | [9] |...| [0] | 
|2    |  1.1 | [0] |...| [9] | 
|3    |  2   | [8] |...| [0] | 
|4    |  2.1 | [0] |...| [3] | 
|5    |  2.2 | [1] |...| [3] | 
|9    |  1   | [5] |...| [0] | 
+-----+------+-----+...+-----+ 
table_a = term table,
table_b = hierarchy table
TRM= TERM, WT= WEIGHT, P=PARENT

我对伪代码的尝试。从逻辑上讲,要获得第一项,我们需要找到 P=0 的记录(意味着它没有父项,并且在这个方案中本身就是父项)并且它的权重值应该是最低的(意味着它的第一项)。类似这样的伪代码,

table_a.ID=table_b.P=0 AND table_a.WT=[lowest value] //e.g. P=0, WT=5, Therefore ID=9;

然后,生成的 ID 是查找子记录的父 ID,

table_a.ID=table_b.P AND table_a.WT[lowest value] //e.g. P=9, WT=0, Therefore ID=2;

其次是,

table_a.ID=table_b.P AND table_a.WT=[lowest value] //e.g. P=2, WT=0, Therefore ID=none;

但我想要的是同一个父母,体重增加,

P=9, WT=1, Therefore ID=none;

我理解将表格串在一起,但这似乎是曲折或振荡的。我很快意识到存在我不理解的深度复杂性。

4

1 回答 1

0

不知道最后的“重量增加”位是什么意思(从什么/哪里增加?) - 但这可能很容易添加到下面......所以,从我的头顶和假设在没有任何函数/存储过程或专用视图的情况下需要单个查询,则如下所示:

[注意:这是在我的脑海中手写的,可能需要一些剪裁、拼写检查和非常可能的优化——它也在 asni sql 中使其独立于数据库(在某种程度上)]

select ID3 from
( 
  select id as id1, min(wt) as w1 from table_a A1 Inner join table_b B1 on A1.id = B1.p
  where p=0
) Q1
inner join
( 
  select id as id2, min(wt) as w2 from table_a A2 Inner join table_b B2 on A2.id = B2.p
) Q2
on Q1.id1 = Q2.id2
inner join
( 
  select id as id3, min(wt) as w3 from table_a A3 Inner join table_b B3 on A3.id = B3.p
) Q3
on Q3.id3 = Q1.id1

编辑:为清楚起见添加...我对问题的理解是这样的。在示例中,我们将 P 值设为零(这可能是最终解决方案中的一个变量)。此查询 (block1) 连接 2 个表 a 和 b 并返回一个 ID (2)。这需要传递回相同的查询(将 P=0 替换为 P=2 以再次匹配表 a 中的 ID)。

此时,该示例给出了当前返回的 ID (5),但确实想使用来自块 1 (p=9) 的 ID,因此此处的第三个块与 P 上的第一个查询连接(输出为 id1)。

这意味着第二个块(Q2)的输出根本没有使用,因此我在上面对此发表了评论。

顺便说一句,所有这些都是使用表 a 和表 b 之间的连接作为 itslef 中的虚拟表。这可以通过使查询更简单(至少更易于阅读)的观点来实现。

如果这不是实际需要的,那么我需要更好地解释在给定示例中需要如何交互步骤(需要什么,而不是解决方案中的当前内容)。我在这里没有预见到问题,这一切似乎都可以在单个查询中的数据库级别上实现。如果这些表非常大,则可能需要一些索引(这也是视图可以提供帮助的地方 - 查看索引 - 或使用 SPROC 和临时表,然后可以对其进行索引)。

于 2012-08-10T17:44:22.880 回答