Быстрый способ получить разницу в два столбца в MySQL
Вопрос
как мне получить поля столбца, которые не совпадают с другим столбцом?
Я пытался:
SELECT table1.page_title
FROM table1, table2
WHERE table1.page_title != table2.page_title
Он создает много повторяющихся полей, поэтому я сделал:
SELECT DISTINCT table1.page_title
FROM table1, table2
WHERE table1.page_title != table2.page_title
но он просто висит.
Любая помощь будет принята с благодарностью, спасибо!
P.S.Я делаю это, чтобы создать список исключений для инструмента Mediawiki MWDumper.Мне это нужно для того, чтобы при импорте выведенного sql мои текущие записи вики не были перезаписаны.
РЕДАКТИРОВАТЬ:Да, это 2 разных стола.У каждого есть около 70 000+ записей также почему мои запросы медленны?Буду признателен, если кто-нибудь разъяснит, чтобы я мог понять, почему :) Еще раз спасибо!
Решение
Являются ли a и b разными таблицами, имеющими столбец «page_title»?
Если да, попробуйте следующее:
SELECT DISTINCT page_title FROM a
WHERE page_title NOT IN (SELECT page_title FROM b)
Если вас интересует только удаление дубликатов (если у вас только одна таблица), то есть несколько способов сделать это, два из которых:
SELECT DISTINCT page_title FROM a
или
SELECT page_title FROM a
GROUP BY page_title
Опция GROUP BY более надежна, хотя и медленнее — вы можете добавить предложение HAVING, чтобы выбирать только те заголовки, которые появляются, например.более чем в два раза:
SELECT page_title FROM a
GROUP BY page_title
HAVING COUNT(page_title) > 2
надеюсь, это поможет
(Спасибо Аарону Ф за комментарий)
Другие советы
Вы можете попробовать самостоятельное соединение, которое я использовал раньше, но я не уверен, будет ли это быстрее, поскольку я не использую MySQL.Эта страница может дать вам некоторое представление: http://www.xaprb.com/blog/2006/10/11/how-to-delete-duulate-rows-with-sql/
Небольшое улучшение ответа Ракса:
SELECT DISTINCT a.page_title FROM a
WHERE a.page_title NOT IN (SELECT DISTINCT b.page_title FROM b)
Есть ли в ваших таблицах индекс в столбце page_title?Что говорит план объяснения ваших вопросов?
Я все равно не могу себе представить, что вам нужен индекс, учитывая, что в вашей таблице всего 70 тысяч строк.
Вы можете сделать это с помощью соединения:
SELECT DISTINCT table1.page_title
FROM table1
LEFT JOIN table2
ON table1.page_title = table2.page_title
WHERE table2.page_title is null
Если это медленно, добавьте индекс (table2.page_title)