Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]PHP & MYSQL Jak znależć zdublowane rekordy w danej kolumnie
Forum PHP.pl > Forum > Przedszkole
poli25
  1. Witam mam problem ze znalezieniem zdublowanych wartości w kolumnie.
  2. Mam utworzoną tabelę przelewy w których kilka osób wpisuje przelewy. Czasem zdarzy się że przelewy się zdublują jak utworzyć zestawienie w phpie aby pokazało mi id kontrahenta i tresci tylko zdublowanych przelewów? Tabela przelewy ma odpowiednio pola: id, id_kontrahenta, tresc, kwota.
  3.  
  4. Zrzut z bazy danych:
  5.  
  6. ID ID_KONTRAHENTA TREŚĆ KWOTA
  7. 1 1 PRZEL.ZA F NR 1 150.15
  8. 2 1 PRZEL. ZA F NR 2 500.10
  9. 3 1 PRZEL.ZA F NR 4 1500.85
  10. 4 1 PRZEL.ZA F NR 5 150.50
  11. 5 1 PRZEL.ZA F NR 1 150.15
  12. 6 2 PRZEL.ZA F NR 859 500.89
  13. 7 2 PRZEL.ZA F NR 988 800.80
  14. 8 2 PRZEL.ZA F NR 9599 800.80
  15. 9 3 PRZEL.ZA F NR 333 950.13
  16. 10 3 PRZEL.ZA F NR 44 4 100.00
  17.  
  18. i chciałbym by php wygenerował mi takie zestawienie:
  19.  
  20. ID KONTRAHENTA
  21. 1
  22. TRESC KWOTA
  23. PRZEL.ZA F NR 1 150.15
  24. PRZEL.ZA F NR 158 150.15
  25. 2
  26. TRESC KWOTA
  27. PRZEL.ZA F NR 988 800.80
  28. PRZEL.ZA F NR 9599 800.80
  29.  
  30. Próbowałem coś zrobić ale mi nie wychodzi. nie wiem jak przekazac z pętli wartości do podpętli. Gdyby to mi sie udało to chyba znalazłbym odpowiedz.
  31.  
  32.  
  33. Chodzi mi tylko zeby wyszukiwało po kwocie, bo czesto jest tak że wartości są te same ale przelewy są na różne dokumenty - to wtedy jest poprawnie. Jeśli jednak zobacze zdublowane wartośvci to treści już sam sobie sprawdze ;).
  34. Z gory dziękuję za pomoc i podowiedzi. Pozdrawiam
askone
A nie lepiej założyć na tablicy index typu unique? Patrząc na strukturę tabelki sugerowałbym założenie takiego indeksu na wszystkie 3 kolumny - zabezpieczy to przed duplikacją rekordów od strony bazy danych.

Jednak właściwym rozwiązaniem byłoby sprawdzenie istnienia rekordu o podanych parametrach w bazie przed zapisaniem nowego... W Twoim przypadku zarówno indeks jak i sprawdzenie może być trudne do wdrożenia ze względu na kolumnę [tresc] typu [text]... Przydałaby się jeszcza dodatkowa kolumna, w której dane byłby bardziej jednoznaczne smile.gif

Pozdrawiam
tehaha
przydałoby się unikalne ID transakcji, po którym przelewy będą rozróżniane bo skoro dane są wprowadzane przez użytkowników to wystarczy jakaś mała literówka i już skrypt rozpozna to jako 2 różne transakcje, właściwie to chyba wystarczy jak numer faktury umieścisz w oddzielnej kolumnie jak INT
poli25
ale te duble zdarzaja się naprawdę rzadko chciałbym zeby mi pokazało po prostu tak jak sobie to wyobrażam w pytaniu. ja dane z bazy moge wyciagac tylko za pomoca php a do programu na którym pracuej nie mam dostępu. zrzut z bazy to jest przyklad i tak pracuje na postgresqlu ale z tym sobie juz poradze. chodzi mi o sposób wyciągnięcia tego mecze sie z tym od tygodnia;/

Cytat(askone @ 23.08.2010, 13:49:46 ) *
A nie lepiej założyć na tablicy index typu unique? Patrząc na strukturę tabelki sugerowałbym założenie takiego indeksu na wszystkie 3 kolumny - zabezpieczy to przed duplikacją rekordów od strony bazy danych.

Niestety ja tylko moge dane z bazy wyciągać ale nie mam zadnych innych uprawnień i nie mogę tego zrobić. Chciałbym otrzymać takie rozwiązanie jak w pytaniu wtedy bede w 100% usatysfakcjonowany. winksmiley.jpg pozdrawiam
wookieb
1) Zajrzyj w ten temat http://forum.php.pl/index.php?showtopic=157405&hl= i przeczytaj cały. Jest tam wiele porad wydajnościowych i problem bardzo podobny
2) Spróbuj takie zapytanie
  1. SELECT [tutaj_lista_pol]
  2. FROM tabela
  3. WHERE kwota IN (SELECT kwota FROM tabela GROUP BY kwota HAVING count(id)>1)
tehaha
w takim razie możesz zrobić zapytanie z COUNT i GROUP BY na polach id_kontrahenta, tresc, kwota, i wyciągasz tylko te które mają COUNT większy niż 1, ale to zadziała tylko jeżeli będą identyczne wpisy, czyli wystarczy jakaś dodatkowa spacja w polu treść i już to nie zadziała
askone
Skoro tak to moja propozycja wygląda tak:
  • pobierasz dane z bazy normalnie - pełen zestaw kolumn
  • po stronie php tworzysz array()
  • jako klucz w tej tablicy proponuje taki ciąg tekstowy [IdKontrahenta]_[kwotaZłote]_[kwotaGrosze] - łącznik to znak "_", Kwotę przelewu należy skonwertować do postaci w której zamiast kropki (lub przecinka) będzie także "_"
  • Dla każdego klucza głównego tworzymy array() i tam wstawiamy po kolei ewentualne zdublowane rekordy


Przykład
Mając tablicę z rekordami jakie podałeś jako przykład otrzymasz:
Kod
[1_150_15][] rekord 1
[1_500_10][] rekord 2
[1_1500_85][] rekord 3
[1_150_50][] rekord 4
[1_150_15][] rekord 5
[2_500_89][] rekord 6
[2_800_80][] rekord 7
[2_800_80][] rekord 8
[3_950_13][] rekord 9
[3_100_00][] rekord 10


Powyższy przykład ukazuje, iż zdublowane wpisy będą dla klucza [1_150_15] i [2_800_80]. Po zbudowaniu takiej tablicy wystarczy już sobie foreach'em wyświetlić wszystkie elementy - lub zrobić var_dump winksmiley.jpg

Pozdrawiam
poli25
Cytat(tehaha @ 23.08.2010, 14:37:10 ) *
w takim razie możesz zrobić zapytanie z COUNT i GROUP BY na polach id_kontrahenta, tresc, kwota, i wyciągasz tylko te które mają COUNT większy niż 1, ale to zadziała tylko jeżeli będą identyczne wpisy, czyli wystarczy jakaś dodatkowa spacja w polu treść i już to nie zadziała

super podpowiedz. Trochę siedzę w postgresqlu ale nie sądziłem ze mozńa tak to obejść winksmiley.jpg super bardzo dziękuję. Widzę że kolega bardzo obeznany w jezyku sql winksmiley.jpg Jestem zadowolony. Dzięki wszystkim za szybkie podpowiedzi winksmiley.jpg
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.