0

背景

我的问题:我有两个表,其中的信息可能存在也可能不存在于两个表中。主要是身份证、姓名和账号。

表结构:

 Table 1                 Table 2
id |  a_name |num      id  |  b_name   | num
-----------------------------------------------
1   |  Bob   | 222  |   1  |   same    | 123 
2   |  Jane  | 1a3  |   2  |   Joe     | 6a4 
3   |  same  | 321  |   3  |   Max     | 123
4   |  same  | 123  |   4  |   same    | 222

我首先要做的是检查表1到表2中是否存在该名称,并确保表2没有表1中存在的任何条目。但是,我还必须比较和对比对应的帐号以便输出类似于:

 Final Table/Array 
id  |  name   |num
---------------------
1   |  Bob   | 222
2   |  Jane  | 1a3
3   |  Joe   | 6a4
4   |  Max   | 123 
5   |  same  | 123  
6   |  same  | 222  
7   |  same  | 321

在比较和对比这两个表之后,我需要能够提取与正确表相关的 id,然后将它们输出到选择器中。

关于如何进行的任何建议,以及正确编码的一些提示?

我正在考虑将它们都循环到单独的数组中,使用两个不同的 in_array 语句,然后根据 if -else 语句输出响应......但我知道这肯定行不通,因为我不知道它们来自哪个表.

关于最佳方法的建议?我不想向您展示我目前拥有的代码,因为它令人难以置信,我现在什至无法理解。

问题说明:

我只需要输出一个不同的(非重复的)名称(和数字)列表,并且能够识别 1)它来自哪个表和 2)原始表中条目的 id,以便我可以使用所有列对应的标识。

4

1 回答 1

0

我只需要输出一个不同的(非重复的)名称列表,并且能够识别 1)它来自哪个表和 2)它的 id。

鉴于您所说的这些条件,这是不可能的:

  1. 一个表可能有多次相同的名称。
  2. 每个表中可能会出现一个名称。

如何生成具有单个源表和 id 的单个名称列表?如果您选择与“获胜者”同名的记录之一,那么您需要说明(table, id)对于给定名称,一对比另一对更受青睐的标准。

例如,以下查询将产生您想要的输出,但据我所知,这样的列表是无用的

SELECT * FROM
  (SELECT a_name AS name, 'table1' AS table, id FROM table1
   UNION ALL
   SELECT b_name AS name, 'table2' AS table, id FROM table2)
AS t1 GROUP BY name

给定您的示例数据,此查询将产生以下可疑实用程序的结果:

name | table  | id
-----+--------+---
Bob  | table1 | 1
Jane | table1 | 2
Joe  | table2 | 2
Max  | table2 | 3
same | table2 | 4

这些结果满足您的标准:没有重复的名称,并且每个名称都有一个(许多可能的)源表和 ID。但是为了什么目的?

如果您的目标是探索不同表中匹配名称之间所有可能的相关性,也许您应该使用完全外连接(在 MySQL 中使用左外连接和右外连接之间的联合进行模拟)。

SELECT table1.id AS a_id, a_name, table1.num AS a_num,
  table2.id AS b_id, b_name, table2.num AS b_num
  FROM table1 LEFT OUTER JOIN table2 ON a_name=b_name
UNION ALL
SELECT table1.id AS a_id, a_name, table1.num AS a_num,
  table2.id AS b_id, b_name, table2.num AS b_num
  FROM table1 RIGHT OUTER JOIN table2 ON a_name=b_name
| a_id | a_name | a_num| b_id  | b_name | b_num  |
+------+--------+------+-------+--------+--------+
| 1    | Bob    | 222  | NULL  | NULL   | NULL   |
| 2    | Jane   | 1a3  | NULL  | NULL   | NULL   |
| 3    | same   | 321  | 1     | same   | 123    |
| 3    | same   | 321  | 4     | same   | 222    |
| 4    | same   | 123  | 1     | same   | 123    |
| 4    | same   | 123  | 4     | same   | 222    |
| 3    | same   | 321  | 1     | same   | 123    |
| 4    | same   | 123  | 1     | same   | 123    |
| NULL | NULL   | NULL | 2     | Joe    | 6a4    |
| NULL | NULL   | NULL | 3     | Max    | 123    |
| 3    | same   | 321  | 4     | same   | 222    |
| 4    | same   | 123  | 4     | same   | 222    |
于 2013-04-01T03:57:51.390 回答