Chcę wyciągnąć zduplikowane rekordy z bazy danych MySQL. Można to zrobić za pomocą:
SELECT address, count(id) as cnt FROM list
GROUP BY address HAVING cnt > 1
Co skutkuje w:
100 MAIN ST 2
Chciałbym go wyciągnąć, aby pokazywał każdy wiersz, który jest duplikatem. Coś jak:
JIM JONES 100 MAIN ST
JOHN SMITH 100 MAIN ST
Wszelkie przemyślenia na temat tego, jak można to zrobić? Próbuję uniknąć wykonania pierwszego, a następnie wyszukania duplikatów za pomocą drugiego zapytania w kodzie.
mysql
duplicates
Chris Bartow
źródło
źródło
źródło
->having(DB::raw('count(*)'), '>', 2)
do zapytania. Wielkie dzięki!>=2
? Wystarczy użyćHAVING COUNT(*) > 1
Dlaczego po prostu INNER DOŁĄCZ DO stołu?
DISTINCT jest potrzebny, jeśli adres może istnieć więcej niż dwa razy.
źródło
WHERE a.id > b.id
odfiltrować tylko nowsze duplikaty, w ten sposób mogę zrobićDELETE
bezpośrednio na wyniku. Przełącz porównanie, aby wyświetlić listę starszych duplikatów.Próbowałem wybrać najlepszą odpowiedź na to pytanie, ale nieco mnie to pomieszało. Tak naprawdę potrzebowałem tego tylko na jednym polu z mojego stołu. Poniższy przykład z tego linku działał dla mnie bardzo dobrze:
źródło
Jest to podobne zapytanie, o które prosiłeś, a jego 200% działa i jest łatwe. Cieszyć się!!!
źródło
Czy to nie jest łatwiejsze:
?
źródło
Znajdź zduplikowanych użytkowników według adresu e-mail za pomocą tego zapytania ...
źródło
możemy znaleźć duplikaty również zależy od więcej niż jednego pola. W tych przypadkach można użyć formatu poniżej.
źródło
Znalezienie zduplikowanych adresów jest znacznie bardziej skomplikowane, niż się wydaje, szczególnie jeśli potrzebujesz dokładności. W tym przypadku zapytanie MySQL nie wystarczy ...
Pracuję w SmartyStreets , gdzie zajmujemy się weryfikacją i usuwaniem duplikatów i innymi rzeczami, i widziałem wiele różnorodnych wyzwań z podobnymi problemami.
Istnieje kilka usług stron trzecich, które oznaczą dla Ciebie duplikaty na liście. Wykonanie tego wyłącznie z podzapytaniem MySQL nie uwzględni różnic w formatach i standardach adresów. USPS (dla adresu w USA) ma pewne wytyczne, aby uczynić te standardy, ale tylko garstka dostawców jest certyfikowana do wykonywania takich operacji.
Tak więc polecam najlepszą odpowiedzią dla ciebie jest na przykład wyeksportowanie tabeli do pliku CSV i przesłanie jej do odpowiedniego procesora list. Jednym z nich jest SmartyStreets Bulk Address Validation Tool, które automatycznie wykona to za kilka sekund do kilku minut. Będzie to oznaczać duplikaty wierszy z nowym polem o nazwie „Duplikuj” i wartością
Y
w nim.źródło
Innym rozwiązaniem byłoby użycie aliasów tabeli, takich jak:
Wszystko tak naprawdę robi w tym przypadku bierze oryginalnej listy stół, tworząc dwa p tabelach retend - p 1 i p 2 , a następnie wykonanie łączenia w kolumnie adresu (wiersz 3). Czwarty wiersz zapewnia, że ten sam rekord nie pojawi się wiele razy w zestawie wyników („duplikaty duplikatów”).
źródło
Nie będzie bardzo wydajny, ale powinien działać:
źródło
Spowoduje to wybranie duplikatów w jednym przebiegu tabeli, bez podkwerend.
To zapytanie aktywnie emuluje
ROW_NUMBER()
obecne wOracle
iSQL Server
Zobacz artykuł na moim blogu, aby uzyskać szczegółowe informacje:
MySQL
.źródło
FROM (SELECT ...) aoo
jest podkwerendą :-PTo również pokaże, ile kopii ma i uporządkuje wyniki bez łączenia
źródło
źródło
SELECT users.name, users.uid, users.mail, from_unixtime(created) FROM users INNER JOIN ( SELECT mail FROM users GROUP BY mail HAVING count(mail) > 1 ) dup ON users.mail = dup.mail ORDER BY users.mail, users.created;
Dla twojego stołu byłoby to coś w rodzaju
To zapytanie da ci wszystkie odrębne wpisy adresu w tabeli list ... Nie jestem pewien, jak to będzie działać, jeśli masz jakieś wartości klucza podstawowego dla nazwy itp.
źródło
Procedura najszybszych zapytań dotyczących usuwania duplikatów:
źródło
Osobiście to zapytanie rozwiązało mój problem:
Skrypt ten pokazuje wszystkie identyfikatory subskrybentów, które istnieją więcej niż jeden raz, w tabeli i liczbę znalezionych duplikatów.
Oto kolumny tabeli:
Mam nadzieję, że będzie to pomocne dla Ciebie!
źródło
Zastąp miasto swoim stołem. Zastąp nazwę swoją nazwą pola
źródło
źródło
źródło
Aby szybko zobaczyć zduplikowane wiersze, możesz uruchomić jedno proste zapytanie
Tutaj sprawdzam tabelę i wymieniam wszystkie zduplikowane wiersze z tym samym identyfikatorem użytkownika, rynkiem i SKU:
Aby usunąć zduplikowany wiersz, musisz zdecydować, który wiersz chcesz usunąć. Np. Ten o niższym identyfikatorze (zwykle starszy) lub może jakiś inny termin. W moim przypadku chcę tylko usunąć dolny identyfikator, ponieważ nowszy identyfikator to najnowsze informacje.
Najpierw sprawdź dwukrotnie, czy odpowiednie rekordy zostaną usunięte. Tutaj wybieram rekord spośród duplikatów, które zostaną usunięte (według unikalnego identyfikatora).
Następnie uruchamiam zapytanie o usunięcie, aby usunąć duplikaty:
Utwórz kopię zapasową, sprawdź dwukrotnie, sprawdź, sprawdź kopię zapasową, a następnie uruchom.
źródło
select address from list where address = any (select address from (select address, count(id) cnt from list group by address having cnt > 1 ) as t1) order by address
wewnętrzne zapytanie podrzędne zwraca wiersze ze zduplikowanym adresem, a następnie zewnętrzne zapytanie podrzędne zwraca kolumnę adresu dla adresu z duplikatami. zewnętrzne zapytanie cząstkowe musi zwrócić tylko jedną kolumnę, ponieważ zostało użyte jako operand dla operatora „= any”
źródło
Odpowiedź Powerlorda jest rzeczywiście najlepsza i zaleciłbym jeszcze jedną zmianę: użyj LIMIT, aby upewnić się, że db nie zostanie przeciążony:
Dobrym nawykiem jest używanie LIMITU, jeśli nie ma GDZIE i podczas łączenia. Zacznij od małej wartości, sprawdź, jak duże jest zapytanie, a następnie zwiększ limit.
źródło