0

バックグラウンド

私の問題: 両方のテーブルに存在する場合と存在しない場合がある情報を含む 2 つのテーブルがあります。主にID、名前、口座番号。

テーブル構造:

 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

2 つのテーブルを比較対照した後、正しいテーブルに関連付けられている ID を取得し、それらをセレクターに出力できるようにする必要があります。

続行する方法に関する提案と、正しくコーディングするためのヒントはありますか?

両方を別々の配列にループし、2 つの異なる in_array ステートメントを使用してから、if -else ステートメントに基づいて応答を出力することを考えていました...しかし、どのテーブルから来たのかわからないため、これは間違いなく機能しません。 .

最良の方法に関する推奨事項は? 私が現在持っているコードをお見せしたくありません。

問題の説明:

名前(および番号)の単一の異なる(重複しない)リストを出力し、1)元のテーブルと2)元のテーブルのエントリのIDを識別して、すべての列をプルできるようにするだけで済みます対応する ID。

4

1 に答える 1

0

名前の単一の異なる (重複していない) リストを出力し、1) どのテーブルからのものか、2) その ID を識別できるようにするだけで済みます。

あなたが述べたこれらの条件を考えると、これは不可能です:

  1. テーブルには、同じ名前が複数回存在する場合があります。
  2. 各テーブルに名前が表示される場合があります。

単一のソース テーブルと ID を持つ名前の単一のリストを作成するにはどうすればよいですか? 「勝者」と同じ名前のレコードの 1 つを選択する場合は(table, id)、特定の名前について、1 つのペアが別のペアよりも優先される基準を述べる必要があります。

たとえば、次のクエリは目的の出力を生成しますが、私が見る限り、そのようなリストは役に立ちません

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

これらの結果は、あなたの基準を満たしています: 重複する名前はなく、各名前には (多くの可能性のある) 1 つのソース テーブルと 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 に答える