2009-05-25 7 views
1

Comment obtenir les champs d'une colonne sans correspondance dans une autre colonne?Comment obtenir la différence de 2 colonnes dans MySQL

J'ai essayé:

SELECT table1.page_title 
FROM table1, table2 
WHERE table1.page_title != table2.page_title 

Il produit beaucoup de champs en double si je l'ai fait un:

SELECT DISTINCT table1.page_title 
FROM table1, table2 
WHERE table1.page_title != table2.page_title 

mais il se bloque juste.

Toute aide serait grandement appréciée, merci!

P.S. Je fais cela afin de pouvoir créer une liste d'exclusion pour l'outil MWDumper de mediawiki. J'en ai besoin pour que lorsque j'importe le sql sorti, mes entrées wiki actuelles ne soient pas écrasées.

EDIT: Oui, il s'agit de deux tables différentes. Chacun a environ 70 000+ enregistrements Aussi pourquoi mes requêtes sont-elles lentes? J'apprécierais que quelqu'un puisse clarifier afin que je puisse apprendre pourquoi :) Merci encore!

+0

S'il vous plaît préciser ce que a et b sont. Sont-ils des tables différentes? Sont-ils deux alias à la même table? –

Répondre

0

Les tableaux a et b sont-ils différents, les deux ayant une colonne "page_title"?

Si oui, essayez ceci:

SELECT DISTINCT page_title FROM a 
WHERE page_title NOT IN (SELECT page_title FROM b) 

Si tout ce que vous êtes intéressé est la suppression des doublons (si vous avez une seule table), alors il y a plusieurs façons de le faire, dont deux sont:

SELECT DISTINCT page_title FROM a 

ou

SELECT page_title FROM a 
GROUP BY page_title 

GROUP BY option est plus forte mais plus lente - vous pouvez ajouter un CLAUS e pour ne choisir que les titres qui apparaissent par ex. plus de deux fois:

SELECT page_title FROM a 
GROUP BY page_title 
HAVING COUNT(page_title) > 2 

espoir qui aide

(Merci Aaron F pour le commentaire)

+0

votre première suggestion a travaillé Rax, merci! :) – alimango

+0

Réponse acceptée sans mise à vote, c'est triste ... –

0

de légère amélioration sur la réponse de Rax:

SELECT DISTINCT a.page_title FROM a 
WHERE a.page_title NOT IN (SELECT DISTINCT b.page_title FROM b) 

Faites vos tables ont un index sur leur colonne page_title? Que dit le plan d'explication pour vos requêtes?

Je ne peux pas imaginer que vous ayez besoin d'un index de toute façon, compte tenu de seulement 70k lignes dans votre tableau.

+0

Merci, la première requête doit évidemment avoir DISTINCT –

0

Vous pouvez le faire avec une jointure:

SELECT DISTINCT table1.page_title 
FROM table1 
LEFT JOIN table2 
    ON table1.page_title = table2.page_title 
WHERE table2.page_title is null 

Si elle est lente, ajouter un index sur (table2.page_title)

Questions connexes