比较两个表输入然后根据id输出

时间:2013-03-31 01:20:09

标签: php mysql arrays

背景

我的问题:我有两个表,其中包含两个表中可能存在或不存在的信息。主要是身份证,姓名和帐号。

表格结构:

 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,以便我可以拉所有具有相应ID的列。

1 个答案:

答案 0 :(得分:0)

  

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

根据您所说的这些条件,这是不可能的:

  1. 一个表可能会多次使用相同的名称。
  2. 每个表格中都可能出现一个名称。
  3. 如何使用单个源表和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    |