web-dev-qa-db-ja.com

MySQLで2つのテーブルを結合して1つのクエリ結果を表示する方法は?

Table1(レコード3)とtable2(レコード3)があります。両方にフィー​​ルド名があります。次に、これらの2つのテーブルから結果を作成します。これにより、両方のテーブルレコードが表示され、重複がある場合は1つしか取得されません。したがって、予想される出力レコードには6行ではなく5行が含まれます。それ、どうやったら出来るの?

例:

table1:                       table2:

+-------------------------+   +--------------------------------+
| Name                        | Name
---------------------------   +---------------------------------
| A    |                      | C    |
| B    |                      | D    |
| C    |                      | E    |


My Expected output is:

+-------------------------+
| Name | ID                
---------------------------
| A    | 1 table1
| B    | 2 table1
| C    | 3 table2 or table1 (no unique)
| D    | 4 table2
| E    | 5 table2

私はこれを試しました:

 SELECT 
  name as name 
 FROM 
  table1
UNION
 SELECT 
  anothernamename as name 
 FROM 
  table2
WHERE
   name like '%C%'

Error: #1054 - Unknown column 'name' in 'where clause'

フォローアップ: Where節との結合+余分な大規模要件。

SELECT * FROM 
(
    ( 
     SELECT * FROM table1 
     WHERE ...
     ORDER BY ...
     LIMIT ...
    ) 
UNION 
    ( 
     SELECT * FROM table2 
     WHERE ...
     ORDER BY ...
     LIMIT ...
    )
) as t
WHERE ...
    ORDER BY ...
3
YumYumYum

必要なクエリは次のとおりです。

SELECT name FROM
(
    SELECT name FROM table1
    UNION
    SELECT name FROM table2
) A;

ここにあなたの質問に基づいたいくつかのサンプルコードがあります:

use test
drop table if exists table1;
drop table if exists table2;
create table table1
(
    id int not null auto_increment,
    name varchar(10),
    primary key (id)
);
create table table2 like table1;
insert into table1 (name) values ('A'),('B'),('C');
insert into table2 (name) values ('C'),('D'),('E');
SELECT name FROM
(
    SELECT name FROM table1
    UNION
    SELECT name FROM table2
) A;

以下は、そのサンプルコードの実行です。

mysql> drop table if exists table1;
Query OK, 0 rows affected (0.03 sec)

mysql> drop table if exists table2;
Query OK, 0 rows affected (0.03 sec)

mysql> create table table1 (
    ->     id int not null auto_increment,
    ->     name varchar(10),
    ->     primary key (id)
    -> );
Query OK, 0 rows affected (0.05 sec)

mysql> create table table2 like table1;
Query OK, 0 rows affected (0.06 sec)

mysql> insert into table1 (name) values ('A'),('B'),('C');
Query OK, 3 rows affected (0.06 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> insert into table2 (name) values ('C'),('D'),('E');
Query OK, 3 rows affected (0.11 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT name FROM (SELECT name FROM table1
    -> UNION SELECT name FROM table2) A;
+------+
| name |
+------+
| A    |
| B    |
| C    |
| D    |
| E    |
+------+
5 rows in set (0.00 sec)

mysql>

試してみる !!!

2
RolandoMySQLDBA

エラーの原因であるようですen table2フィルタリングする列はanothernamenameではなくnameです。WHEREにエイリアスを付けることはできません。いずれにせよ、あなたの質問では、結果をフィルタリングしたくないようで、WHEREはまったく役に立ちません。クエリは次のようになります。

SELECT 
FROM (  SELECT [name]
        FROM table1
        UNION
        SELECT anothernamename 
        FROM table2) AS Data
WHERE ....
ORDER BY ....
LIMIT .....
2
Lamak