Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]PHP & MYSQL Jak znależć zdublowane rekordy w danej kolumnie
poli25
post 23.08.2010, 12:40:00
Post #1





Grupa: Zarejestrowani
Postów: 239
Pomógł: 20
Dołączył: 19.02.2010

Ostrzeżenie: (0%)
-----


  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


Ten post edytował poli25 23.08.2010, 12:47:56
Go to the top of the page
+Quote Post
askone
post 23.08.2010, 12:49:46
Post #2





Grupa: Zarejestrowani
Postów: 654
Pomógł: 121
Dołączył: 27.10.2007
Skąd: Poznań, Łódź

Ostrzeżenie: (0%)
-----


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


--------------------
Kliknij jeśli moja odpowiedź Ci pomogła.
askone.pl
Go to the top of the page
+Quote Post
tehaha
post 23.08.2010, 13:05:47
Post #3





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
poli25
post 23.08.2010, 13:32:19
Post #4





Grupa: Zarejestrowani
Postów: 239
Pomógł: 20
Dołączył: 19.02.2010

Ostrzeżenie: (0%)
-----


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

Ten post edytował poli25 23.08.2010, 13:24:21
Go to the top of the page
+Quote Post
wookieb
post 23.08.2010, 13:35:54
Post #5





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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)


Ten post edytował wookieb 23.08.2010, 13:44:48


--------------------
Go to the top of the page
+Quote Post
tehaha
post 23.08.2010, 13:37:10
Post #6





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
askone
post 23.08.2010, 13:41:42
Post #7





Grupa: Zarejestrowani
Postów: 654
Pomógł: 121
Dołączył: 27.10.2007
Skąd: Poznań, Łódź

Ostrzeżenie: (0%)
-----


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


--------------------
Kliknij jeśli moja odpowiedź Ci pomogła.
askone.pl
Go to the top of the page
+Quote Post
poli25
post 23.08.2010, 13:45:29
Post #8





Grupa: Zarejestrowani
Postów: 239
Pomógł: 20
Dołączył: 19.02.2010

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 6.06.2025 - 18:51