我的问题:我有两个表,其中包含两个表中可能存在或不存在的信息。主要是身份证,姓名和帐号。
表格结构:
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的列。
答案 0 :(得分:0)
我只需要输出一个不同的(非重复的)名称列表,并且能够识别1)哪个表来自和2)其id。
根据您所说的这些条件,这是不可能的:
如何使用单个源表和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 |