![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 131 Pomógł: 0 Dołączył: 9.02.2009 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Mam dwie tabele w bazie ( nie wypisuje wszystkich pól, tylko te co są istotne przy moim problemie): tab.a1 ID | nazwa | numer| 1 | cytryna| 1001| 2 |kiwi | 1002| 3 |banan | 1003| 4 |jabłko | 1004| itd. tab.b1 ID |nr2 | czas | atrybut| 1 | 1001| 20130105 | h| 2 | 1001 | 20130108 | r | 3 | 1001| 20130110 | h| 4 |1002 | 20130106 | h| 5 | 1002| 20130109 | h| 6 |1003 | 20130114 | r| 7 |1003 |20130115 | r| 8 |1004 |20130110 | a| Pierwsza część działa mi prawidłowo, otrzymuję wszystkie wyniki spełniające zapytanie
w wyniku otrzymuję taką tabelkę: 1.cytryna 1001 h 2.cytryna 1001 r 3.kiwi 1002 h 4.banan 1003 r 5.jabłko 1004 a Teraz chciałbym by nastapiło zliczenie wg takiego rozwiązania po atrybutach. Jeśli dana produkt ( np. cytryna ) wystepuje w dwóch wynikach z różnymi atrybutami ( h, r ) to chcę by to było zliczone jako h i by w tabeli poniżej nastepowało sumowanie po atrybutach (analogicznie sobie już pozostałe ustawienia dopasuję ) czyli w tym przypadku: atrybut h - 2 ( czyli cytryna i kiwi ) atrybut r - 1 ( czyli banan) atrybut a - 1 (czyli jabłko )
W jaki sposób można to zrobić, proszę o jakieś podpowiedzi i wskazówki. |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Tworzysz tyle tablic ile masz atrybutów.
Lecisz w petli po elementach z bazy. Jeśli atrybut to nie h, to patrzysz czy w tablicy z h już jest ten element (in_array()). Jak nie ma to dodajesz do danego atrybutu. Jak jest to nic z tym nie robisz. Jeśli atrybut to h, to dodajesz do tablicy z h i patrzysz, czy w innych tablicach jest. Jak jest w innych to usuwasz z tych innych I juz. -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 131 Pomógł: 0 Dołączył: 9.02.2009 Ostrzeżenie: (0%) ![]() ![]() |
kombinuje jak to zroić, ale mi niestety nie wychodzi, ani z tablicami ani później z warunkami.
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) ![]() ![]() |
Podałeś, co masz na wejściu. Pokaż wyjście, a pokażę ci jak je uzyskać. W SQL-u. Żadnego kodu PHP.
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 131 Pomógł: 0 Dołączył: 9.02.2009 Ostrzeżenie: (0%) ![]() ![]() |
Po przerobieniu kod wygląda jak poniżej, mam jednak parę pytań.
Z tabeli dawcy interesują mnie tylko pola: DADWNR, DADWNZ, DADWIM, DADWPS, DADWA1, DADWA2, DAPLNR z tabeli oddania tylko: ODDNR1, ODDWNR, ODDNNR, ODDNDT obie z tych tabel zawierają więcej pól
Przy takim założeniu otrzymuję wynik 98 co odpowiada faktycznemu stanowi ( docelowo jednak musi być też grupowanie) Sprawa druga czyli sumowanie po atrybutach czyli po polu ODDNR1
Ten post edytował dopal 12.02.2013, 08:26:36 |
|
|
![]()
Post
#6
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
@dopal algorytm co ci podałem miałes robić w jednej pętli a nie w piętnastu pętlach. A tą jedną pętlą miała być pętla, którą już miałeś:
while( $set = mysql_fetch_assoc( $result)){ ///tu miałęś robić algorytm co ci podałem } -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 131 Pomógł: 0 Dołączył: 9.02.2009 Ostrzeżenie: (0%) ![]() ![]() |
@dopal algorytm co ci podałem miałes robić w jednej pętli a nie w piętnastu pętlach. A tą jedną pętlą miała być pętla, którą już miałeś: while( $set = mysql_fetch_assoc( $result)){ ///tu miałęś robić algorytm co ci podałem } ale to jest teraz odbc a nie mysql, dlatego tu sie gubie, przy mysql w miarę to mi wyszło |
|
|
![]()
Post
#8
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
To nie ma żadnej różnicy. Petla do pobierania danych z bazy, w obu wypadkach, jest tylko jedna.
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 131 Pomógł: 0 Dołączył: 9.02.2009 Ostrzeżenie: (0%) ![]() ![]() |
coś takiego? |
|
|
![]()
Post
#10
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Po co te FOEREACH w głównej petli? Po co to:
$dane[]=$set; rekord z bazy masz w $set. Po co go jeszcze zapisujesz do tablicy, a potem latasz po tej tablicy? Inicjalizacja tablic atrybutów miałeś robić przed pętlą a nie w petli. -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 131 Pomógł: 0 Dołączył: 9.02.2009 Ostrzeżenie: (0%) ![]() ![]() |
Nie wiem jak to ma byc, możesz to konkretnie podać, bo już mnie nerwica bierze na to jak ma to wyglądać.
Dziś muszę mieć te dane wyciągnięte do sprawozdania w pracy, a ciągle jestem w d...
coś takiego? |
|
|
![]()
Post
#12
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Z Twojego opisu (z tego w temacie i z tego na PW) wywnioskowałem, że element może być kilkukrotnie, ale wówczas jest napewno w h oraz raz w czymś innym niż h. Z ifów co tu podales wynika, że element może być wiele razy w różnych atrybutach i przy okazji może go nie być w h. Tak?
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 131 Pomógł: 0 Dołączył: 9.02.2009 Ostrzeżenie: (0%) ![]() ![]() |
Tak.
Element może być np. 3 razy w h, p, r - wtedy ma byc zliczony jako raz w h, w pozostałych już nie. Może być przypadek ze coś będzie tylko w r, to ma byc liczone w r tak jak w ifach ustawione jest: najpierw h, póżniej r, p, a Wyniki z takiego zapisu juz otrzymuję, jest jednak małe przekłamanie, gdyż w zapytaniu powinno być jeszcze GRUOP BY ODDWNR, ODDNR1 ale wtedy otrzymuję komunuikat Warning: odbc_exec() [function.odbc-exec]: SQL error: [IBM][Sterownik ODBC iSeries Access][DB2 UDB]SQL0122 - Niepoprawna kolumna DADWNR lub wyra�enie na li�cie SELECT., SQL state S1000 in SQLExecDirect in D:\www\apache\htdocs\zest_magpoj.php on line 164 S1000 |
|
|
![]()
Post
#14
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Dobra, zmiana algorytmu. Może trochę dłuższy, ale prostrzy.
Petla główna jak do tej pory. Przed pętlą inicjalizujesz tablicę $element = array() W petli: jesli atrybut = h, $element[$nazwa_elementu] = h jesli atrybut = r and (nieisntieje $element[$nazwa_elementu] or $element[$nazwa_elementu]!=h), $element[$nazwa_elementu] = r jesli atrybut = p and (nieisntieje $element[$nazwa_elementu] or $element[$nazwa_elementu]!=h and $element[$nazwa_elementu]!=r), $element[$nazwa_elementu] = p jesli atrybut = a and (nieisntieje $element[$nazwa_elementu] or $element[$nazwa_elementu]!=h and $element[$nazwa_elementu]!=r and $element[$nazwa_elementu]!=p), $element[$nazwa_elementu] = a Dzieki temu bedziesz mial tablice elementow, z wpisem, który gdzie nalezy. Teraz inicjalizujesz 4 tablice h r p a po czym lecisz po tablicy elementów $element foreach ($element as $el => $atr){ //a tutaj w zaleznosci czy $atr jest rowny h r p czy a to dodajesz $el do tablicy h r p lub a } -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 131 Pomógł: 0 Dołączył: 9.02.2009 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#16
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
NIe....
Nie: $element['ODDNR1'] = H; a: $element[nazwaelememntu czyli jablko, kiwi...nazwa ktora masz w pobranym rekordzie. tak jak atrybut masz h r p lub a tak i nazwy sie przeciez zmieniaja...] = H; -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) ![]() ![]() |
Wstaw odpowiednie nawiasy do SQL (WHERE), bo teraz to kicha przeokrutna tam jest.
|
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 131 Pomógł: 0 Dołączył: 9.02.2009 Ostrzeżenie: (0%) ![]() ![]() |
No to będzie problem bo tych nazw będzie dużo.
W tym kodzie co dziś dałem, to już nie jest prosta tabela. W tabeli dawcy - są dane osobowe osób kilkadziesiąt tysięcy w tabelii oddania są informacje o oddaniach krwi jakie osoba dokonała w danym roku. Przy każdym oddaniu może być ten atrybut:h, r, p, a zliczenie ma polegać na wybraniu wszystkich osób z danego przedziału czasowego, którzy oddawali krew. Wiadomo, że można oddać kilka razy w roku, dlatego w zabytaniu chciałem pogrupować najpierw po ODDWNR czyli jest to numer, można powiedzieć ze id takiej osoby, a nastepnie pogrupować po ODDNR1 czyli po atrybucie h, r, p, a. Z takiego zapytania powinienem otrzymać np. Jan Kowalski R Jan kowalski H Jan Nowak R Piotr Malinowski A Z tej tabeli wiem, że kowalski oddawał krew z atrybutem H i R ( przynajmniej po jednym razie ), nowak oddawał tylko z atrybutem R, a malinowski z atrybutem A Założenia atrybutów są takie jak w kodzie, czyli jak ktoś oddawał np. H, R, P to ma być zliczony jako raz do H, jak ktoś tylko R, to raz do R z tych załozeń mamy: Kowalski - R i H - czyli zliczamy do H Nowak - R - zliczamy do R Malinowski A-zliczamy do A otrzymany wynik z tego przykładu powinien być taki: liczba osób z atrybutem H - 1 liczba osób z atryb. R - 1 liczba osób z atryb A- 1 Może teraz to jest jasniej, nie chciałem dokładnie tego opisywać, bo chciałem sam to zrobić, dlatego posługiwałem sie owocami jako przykładem Wstaw odpowiednie nawiasy do SQL (WHERE), bo teraz to kicha przeokrutna tam jest. Właśnie nie wiem jak powinny one być wstawione. |
|
|
![]()
Post
#19
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat No to będzie problem bo tych nazw będzie dużo. A co za różnica czy tych nazw bedzie 2, 5 czy 5 mln?? No żadna. Przecież ciebie nazwy jako takie nie obchodzą. One są w rekordzie. Co w nim jest to jest. Ciebie to nic nie interesuje....$nazwaelementu = $row['nazwa']; i juz. a co sie tam kryje to ciebie nic to nie obchodzi. Ty sie poslugujesz zmienna $nazwaelementu a nie jej konkretną wartoscia.... ps: bardzo mnie to ciekawi: pisales ze masz to zrobic do pracy. Mogę zapytać gdzie pracujesz i jako kto? -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#20
|
|
Grupa: Zarejestrowani Postów: 131 Pomógł: 0 Dołączył: 9.02.2009 Ostrzeżenie: (0%) ![]() ![]() |
Pracuje jako osoba ds. organizacyjnych w służbie zdrowia ( głównie sprawozadanie, zestawienia itp ) i żeby nie zliczać wszystkiego na piechotę to robię sobie różne pomoce, które mi to ułatwią. a w programie który uzywamy nie ma wielu takich zestawień.
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 21:43 |