需要合并类似表的查询

时间:2015-09-26 00:16:59

标签: php mysql

很抱歉LONG解释,但我不知道如何简要解释这个...我有一个表(table_animals),在名为Taxon的字段中有动物的科学名称。表中的行看起来像这样(其中N只是一个数字键):

N | Taxon | Parent | CommonName | Rank
13 | Ursus-maritimus | Ursus | polar bear | 65

科学名称有时会改变或重组,所以我会相应更新我的表格。我首先创建了一个新表(table_animals_new),其中包含当前的科学名称。它只有两个领域,分类和排名......

N | Taxon | Rank
9 | Ursus-maritimus | 65

我现在想以某种方式将两个表结合起来在两个表中显示所有内容。

因此,假设这代表旧数据(table_animals)......

N | Taxon | Parent | CommonName | Rank
11 | Ursidae | Carnivora | bear family | 45
12 | Ursus | Ursidae | typical bears | 55
13 | Ursus-maritimus | Ursus | polar bear | 65
14 | Ursus-blue | Ursus | blue bear | 65

将其与新表中的数据(table_animals_new)...

进行比较
N | Taxon | Parent | CommonName | Rank
8 | Ursinidae | Carnivora | bear family | 45
9 | Ursus | Ursinidae | typical bears | 55
10 | Ursus-maritimus | Ursus | polar bear | 65
11 | Ursus-red | Ursus | red bear | 65

在这个虚构的例子中,蓝熊(Ursus-blue)不再被认为是一个物种,所以它没有在新表中列出。然而,科学家们发现了一种新物种 - 红熊(Ursus-red),这种物种没有在旧表中列出。此外,熊现在被放置在Ursinidae科,而不是Ursidae。

我想做的是......

1)显示新表中的所有行(table_animals_new)

2)在匹配的行上显示旧表中的所有杂项信息。因此,如果新表有一行Taxon ='Ursus',而旧表也有一行Taxon ='Ursus',那么旧表中与Ursus相关的字段(例如CommonName)也会显示。

3)显示“孤立行” - 旧表中与新表中的任何内容都不匹配的行(例如,Taxon ='Ursus-blue')。

4)以某种方式将孤立的行标记为“孤立的”。如果我有一个包含50,000行的表,并且我看到Taxon ='red-blue'的行,我不会知道它来自哪个表。所以我想要一个额外的列,说“孤立的行”或“不孤立”(或NULL)。

如果不是太困难,还有一个非常酷的选项......标记出现在新表中的分类但不是旧表“新”。

所以完成的表可能看起来像这样:

N | Taxon | Parent | CommonName | Rank | Orphaned
11 | Ursidae | Carnivora | bear family | 45 | orphan
12 | Ursinidae | Carnivora | bear family | 45 | NEW
13 | Ursus | Ursidae | typical bears | 55 | (NULL)
14 | Ursus-maritimus | Ursus | polar bear | 65 | (NULL)
15 | Ursus-blue | Ursus | blue bear | 65 | orphan
16 | Ursus-red | Ursus | red bear | 65 | NEW

我想我可以在两到三次操作中执行此操作,但我想知道如何只使用一个查询来执行此操作。下面是我正在尝试做的更简化的例子。

旧表

A

C

d

新表

A

d

电子

合并显示

A

C(孤儿 - 仅在旧表中)

d

E(新增 - 仅限新表)

1 个答案:

答案 0 :(得分:1)

我建议使用Union Query。 您可以将其分解为3个查询:   - 两者中都存在的那些记录   - 仅存在于表A中的那些记录   - 仅表B中存在的那些记录