如何连接SQL查询的两个表,其中第二个表用于对第一个表进行排序?

时间:2012-08-10 17:14:28

标签: mysql

我正在努力理解一个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;

我理解将表格串在一起,但这似乎是ziz-zag或oscilate。我很快意识到有一个我不理解的深度复杂性。

1 个答案:

答案 0 :(得分:0)

不确定你的意思是“最后增加重量”位(从什么/哪里增加?) - 但这可能很容易添加到下面...所以,在顶部我的头,并假设一个单一的查询是没有任何函数/ sprocs或专用视图,然后像这样:

[注意:这是手写的,可能需要一些剪裁,拼写检查和非常喜欢的显示 - 它也是在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中的ID(p = 9),因此这里的第三个块与P上的第一个查询连接(输出为as) ID1)。

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

很明显,所有这一切都是使用表a和表b之间的连接作为其fromlef中的虚拟表。这可以通过使查询更简单(至少更容易阅读)的视图来实现。

如果这不是实际需要的,那么我需要更好地解释在给定示例中如何进行交互所需的步骤(所需的内容,而不是解决方案中的当前内容)。我没有预见到这里的问题,在单个查询中数据库级别似乎都可行。有些人认为可能需要索引,如果这些表完全相同(这也是视图可以帮助的地方 - 查看索引 - 或使用SPROC和临时表,然后可以将其编入索引)。