2010-03-24 5 views
2

J'ai deux tables avec la même structure:mysql - tables syndicales par champ unique

id name 
1 Merry 
2 Mike 

and 

id name 
1 Mike 
2 Alis 

Je dois union deuxième table d'abord à garder des noms uniques, de sorte que ce résultat est le suivant:

id name 
1 Merry 
2 Mike 
3 Alis 

Est-il possible de le faire avec une requête MySQL, sans utiliser le script PHP?

+1

Ehmmm, quel ID voulez-vous avoir pour Mike ..? Vous ne pouvez pas aller pour la chance aléatoire, parce que dans t1 il a 2 et dans t2 il a 1 – douwe

+0

id devrait être unique. Pas d'autres exigences. – Qiao

Répondre

8

Ceci n'est pas une jointure (ensemble de multiplication), c'est une union (ajout d'ensemble).

SELECT @r := @r + 1 AS id, name 
FROM (
     SELECT @r := 0 
     ) vars, 
     (
     SELECT name 
     FROM table1 
     UNION 
     SELECT name 
     FROM table2 
     ) q 
+0

Ah sympa, vous avez pensé qu'il a besoin d'une nouvelle séquence comme ID – douwe

+0

où puis-je lire sur la syntaxe "@r: = @r + 1"? jamais vu avant – Qiao

+0

@Qiao: http://dev.mysql.com/doc/refman/5.5/fr/user-variables.html – Quassnoi

1

Utilisation:

SELECT a.id, 
     a.name 
    FROM TABLE_A a 
UNION 
SELECT b.id, 
     b.name 
    FROM TABLE_B b 

UNION supprimera les doublons.

+0

Mais ne pas créer la nouvelle valeur d'ID ... –

+0

Oui, je me suis juste dit que dans mon cas, je peux simplement supprimer l'ID, puis les tables UNION et que d'ajouter un nouvel ID. C'est moyen facile. – Qiao

+0

En utilisant les exemples de données de Qiao, vous obtiendrez deux Mikes dans le jeu de résultats, avec les identifiants 1 et 2. Pour que UNION supprime les doublons, la ligne entière doit être identique. –

0

Comme commenté, tout dépend de ce que votre « id » signifie, parce que dans l'exemple, cela ne signifie rien.

SELECT DISTINCT(name) FROM t1 JOIN t2 ON something 

si vous ne souhaitez que les noms

SELECT SUM(something), name FROM t1 JOIN t2 ON something GROUP BY name 

si vous voulez faire quelque groupe par

SELECT DISTINCT(name) FROM t1 JOIN t2 ON t1.id = t2.id 

si les id sont les mêmes

+0

vos requêtes renvoient uniquement les noms en double. Le résultat souhaité est une union non redondante. – dnagirl

0
SELECT DISTINCT COALESCE(t1.name,t2.name) FROM 
mytable t1 LEFT JOIN mytable t2 ON (t1.name=t2.name); 

sera vous obtenez une liste unique noms des 2 tables. Si vous voulez qu'ils obtiennent de nouveaux ids (comme Alis fait dans vos résultats souhaités), qui est quelque chose d'autre et nécessite des réponses à quelques questions:

  • font l'un des noms ont besoin pour maintenir leur carte d'identité précédente. Et s'ils le font, quel ID de table devrait être préféré?
  • Pourquoi avez-vous 2 tables avec la même structure? c'est-à-dire qu'essayez-vous d'accomplir lorsque vous générez la liste de noms unique?
2

Ceci sélectionne tous les noms de table1 et combine ceux avec tous les noms de table2 qui ne sont pas dans table1.

(
select * 
from table1   
) 
union 
(  
select * 
from table2 t2 
left join table1 t1 on t2.name = t1.name 
where t1.id is null 
)