web-dev-qa-db-fra.com

Comment rejoindre deux table et montrer un résultat de la requête dans MySQL?

J'ai une table1 (enregistrements 3) et Tabley2 (enregistrements 3). Où j'ai le nom de champ dans les deux. Maintenant, je veux générer un résultat de ces deux table, qui me montrera les deux enregistrements de table et ne prendront qu'un seul s'il y a duplicata. Donc, mes enregistrements de sortie attendus contiennent 5 rangées et non 6 rangées. Comment je fais ça?

Exemple:

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

J'ai essayé ceci:

 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'

Suivi : Union avec l'endroit où la clause + extra large extra large.

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

Voici la requête dont vous avez besoin:

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

Voici quelques échantillons de code basé sur votre question:

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;

Voici l'exécution de cet exemple de code:

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>

Essaie !!!

2
RolandoMySQLDBA

Il semble que votre erreur soit causée en table2 La colonne que vous souhaitez filtrer est anothernamename, pas name, vous ne pouvez pas mettre un alias sur le WHERE. Dans tous les cas, dans votre question, vous ne semblez pas vouloir filtrer vos résultats, de sorte que WHERE est sans usage du tout. Votre requête devrait simplement être:

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