Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Jak wyliczyć wyniki z zapytania
Forum PHP.pl > Forum > Przedszkole
Stron: 1, 2
dopal
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

  1. <?php
  2.  
  3. $query="SELECT * FROM a1 inner join b1 where numer=nr2 and czas2 between '20130101' AND '20130115' group by nazwa, atrybut";
  4.  
  5. $result=mysql_query($query) or die( odbc_error());
  6. $ilosc = mysql_num_rows($result);
  7.  
  8. $i = 0;
  9. while( $set = mysql_fetch_assoc( $result)){
  10. $i++;
  11.  
  12. $wynik = $i%2;
  13. if($wynik == "0"){
  14. $kolor = "white";}
  15. else {
  16. $kolor = "lightgreen";
  17. }
  18. echo '<tr bgcolor='.$kolor.'><td width="5%">'.$i.'.</td>
  19. <td width="25%">'.$set['nazwa'].'</td>
  20. <td width="12%">'.$set['nr2'].'</td>
  21. <td width="12%">'.$set['atrybut'].'</td>
  22. </tr>';
  23.  
  24. }?>

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 )

  1.  
  2. //nie wiem w jaki sposób osiągnąć to co wyżej opisałem.
  3.  
  4. echo ' <tr bgcolor='.$kolor.'><td width="5%">1.</td>
  5. <td width="25%">'.$ilosc.'</td>
  6. <td width="25%">atrybut H '.$questionmark.gifquestionmark.gifquestionmark.gif.'</td>
  7. <td width="25%">atrybut R '.$questionmark.gifquestionmark.gifquestionmark.gif.'</td>
  8. <td width="25%">atrybut A '.$questionmark.gifquestionmark.gifquestionmark.gif.'</td>
  9. ';
  10. ?>

W jaki sposób można to zrobić, proszę o jakieś podpowiedzi i wskazówki.
nospor
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.
dopal
kombinuje jak to zroić, ale mi niestety nie wychodzi, ani z tablicami ani później z warunkami.
mmmmmmm
Podałeś, co masz na wejściu. Pokaż wyjście, a pokażę ci jak je uzyskać. W SQL-u. Żadnego kodu PHP.
dopal
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

  1. <?
  2. $query="SELECT DADWNR, DADWNZ, DADWIM, DADWPS, DADWA1, DADWA2, DAPLNR, ODDNR1, ODDWNR, ODDNNR, ODDNDT FROM DAWCY
  3. INNER JOIN ODDANIA on DADWNR=ODDWNR AND DAPLNR=ODPLNR
  4. WHERE
  5. ODDNDT Between '20121231' And '20121231' AND ODDNKD='E5' OR
  6. ODDNDT Between '20121231' And '20121231' AND ODDNKD='EA' OR
  7. ODDNDT Between '20121231' And '20121231' AND ODDNKD='EK' OR
  8. ODDNDT Between '20121231' And '20121231' AND ODDNKD='EP' ";
  9.  
  10. //SPRAWA 1
  11. //chciałem by w zapytaniu było grupowanie, na końcu dodałem GRUOP BY ODDWNR, ODDNR1 otrzymuję komunuikat
  12. //Warning: odbc_exec() [function.odbc-exec]: SQL error: [IBM][Sterownik ODBC iSeries Access][DB2 UDB]SQL0122 -
  13. // Niepoprawna kolumna DADWNR lub wyra�enie na li�cie SELECT., SQL state S1000 in SQLExecDirect in D:\www\apache\htdocs\zest_magpoj.php
  14. //on line 164 S1000
  15. //jak powinno wyglądać poprawnie zapytanie w tym przypadku?
  16.  
  17. $result = odbc_exec($connect, $query) or die( odbc_error());
  18.  
  19. $ilosc = odbc_num_rows($result);
  20. ?>
  21. <table border="1">
  22. <tr bgcolor="#24FF19"><td width="3%" align="center"><b>Lp.</b></td>
  23. <td align="center"><b>Nr plac.</b></td>
  24. <td align="center"><b>Nazwa skł.</b></td>
  25. <td align="center"><b>Placówka don.</b></td>
  26. <td align="center"><b>Nr don.</b></td>
  27. <td align="center"><b>Pojemnik</b></td>
  28. <td align="center"><b>Zwrot</b></td>
  29. <td align="center"><b>flaga</b></td>
  30. <td align="center"><b>dostawca</b></td>
  31. <td align="center"><b>Odbiorca</b></td>
  32. <td align="center"><b>Poj. zwrocony</b></td>
  33. <td align="center"><b>Data don</b></td>
  34. </tr>
  35.  
  36. <?php
  37. $x=0;
  38. while(odbc_fetch_row($result)) {
  39.  
  40. $x++;
  41.  
  42. $a1 = odbc_result($result, 1);
  43. $a2 = odbc_result($result, 2);
  44. $a3 = odbc_result($result, 3);
  45. $a4 = odbc_result($result, 4);
  46. $a5 = odbc_result($result, 5);
  47. $a6 = odbc_result($result, 6);
  48. $a7 = odbc_result($result, 7);
  49. $a8 = odbc_result($result, 8);
  50. $a9 = odbc_result($result, 9);
  51. $a10 = odbc_result($result, 10);
  52. $a11 = odbc_result($result, 11);
  53.  
  54.  
  55. {
  56. echo '<tr ><td align="center">'.$x.'</td>
  57. <td align="center">'.$a1.'</td>
  58. <td align="center">'.$a2.'</td>
  59. <td align="center">'.$a3.'</td>
  60. <td align="center">'.$a7.'</td>
  61. <td align="center">'.$a4.'</td>
  62. <td align="center">'.$a5.'</td>
  63. <td align="center">'.$a6.'</td>
  64. <td align="center">'.$a8.'</td>
  65. <td align="center">'.$a9.'</td>
  66. <td align="center">'.$a10.'</td>
  67. <td align="center">'.$a11.'</td>
  68.  
  69. </tr>';
  70. }}
  71. ?>


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
  1. //$a11 = odbc_result($result, 11);
  2. //po tej lini dodaje ten kod co poniżej
  3. //przy takim zapisie wyswietla mi w tabeli połowe wyników czyli 49, tak jak by brał co drugi
  4.  
  5. $dane[]=odbc_fetch_row($result);
  6.  
  7. $tab_h=array();
  8. $tab_r=array();
  9. $tab_p=array();
  10. $tab_a=array();
  11.  
  12. foreach ($dane as $item) {
  13.  
  14. if($item['oddnr1']=='H')
  15. $tab_h[]=$item['oddwnr'];
  16. }
  17.  
  18. foreach ($dane as $item) {
  19. if($item['oddnr1']=='R' && !in_array($item['oddwnr'],$tab_h))
  20. $tab_r[]=$item['oddwnr'];
  21. }
  22. foreach ($dane as $item) {
  23. if($item['oddnr1']=='P' && !in_array($item['oddwnr'],$tab_h)&& !in_array($item['oddwnr'],$tab_r))
  24. $tab_p[]=$item['oddwnr'];
  25. }
  26. foreach ($dane as $item) {
  27. if($item['oddnr1']=='A' && !in_array($item['oddwnr'],$tab_h)&& !in_array($item['oddwnr'],$tab_r)&& !in_array($item['oddwnr'],$tab_p))
  28. $tab_a[]=$item['oddwnr'];
  29. }
  30. // powyższy zapis nie daje mi oczekiwanego wyniku zliczania, co świadczy że składnia jest zła, jak to powinno wyglądać prawidłowo
  31.  
  32. {
  33. echo '<tr ><td align="center">'.$x.'</td>
  34. <td align="center">'.$a1.'</td>
  35. <td align="center">'.$a2.'</td>
  36. <td align="center">'.$a3.'</td>
  37. <td align="center">'.$a7.'</td>
  38. <td align="center">'.$a4.'</td>
  39. <td align="center">'.$a5.'</td>
  40. <td align="center">'.$a6.'</td>
  41.  
  42. <td align="center">'.$a8.'</td>
  43. <td align="center">'.$a9.'</td>
  44. <td align="center">'.$a10.'</td>
  45. <td align="center">'.$a11.'</td>
  46.  
  47. </tr>';
  48. }}
  49. //oczywiście poniżej nie wyświetlaja mi się wyniki wg założeń, tylko 0
  50. print_r($dane);
  51. echo 'Atrybut h: '.count($tab_h).'<br />';
  52. echo 'Atrybut r: '.count($tab_r).'<br />';
  53. echo 'Atrybut p: '.count($tab_p).'<br />';
  54. echo 'Atrybut a: '.count($tab_a).'<br />';
  55.  
  56. ?>
nospor
@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
}
dopal
Cytat(nospor @ 12.02.2013, 09:09:19 ) *
@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
nospor
To nie ma żadnej różnicy. Petla do pobierania danych z bazy, w obu wypadkach, jest tylko jedna.
dopal
  1. ?php
  2. $x=0;
  3. while($set=odbc_fetch_row($result)){
  4. $dane[]=$set;
  5.  
  6.  
  7. $tab_h=array();
  8. $tab_r=array();
  9. $tab_p=array();
  10. $tab_a=array();
  11.  
  12. foreach ($dane as $item) {
  13. if($item['ODDNR1']=='H')
  14. $tab_h[]=$item['ODDWNR'];
  15. }
  16.  
  17. foreach ($dane as $item) {
  18. if($item['ODDNR1']=='R' && !in_array($item['ODDWNR'],$tab_h))
  19. $tab_r[]=$item['ODDWNR'];
  20. }
  21. foreach ($dane as $item) {
  22. if($item['ODDNR1']=='P' && !in_array($item['ODDWNR'],$tab_h)&&
  23. !in_array($item['ODDWNR'],$tab_r))
  24. $tab_p[]=$item['ODDWNR'];
  25. }
  26. foreach ($dane as $item) {
  27. if($item['ODDNR1']=='A' && !in_array($item['ODDWNR'],$tab_h)&&
  28. !in_array($item['ODDWNR'],$tab_r)&& !in_array($item['ODDWNR'],$tab_p))
  29. $tab_a[]=$item['ODDWNR'];
  30. }
  31.  
  32. }
  33. print_r($dane);
  34. echo 'Atrybut h: '.count($tab_h).'<br />';
  35. echo 'Atrybut r: '.count($tab_r).'<br />';
  36. echo 'Atrybut p: '.count($tab_p).'<br />';
  37. echo 'Atrybut a: '.count($tab_a).'<br />';
  38.  
  39. ?>

coś takiego?
nospor
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.
dopal
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...

  1. <?php
  2. $x=0;
  3.  
  4. $tab_h=array();
  5. $tab_r=array();
  6. $tab_p=array();
  7. $tab_a=array();
  8.  
  9.  
  10.  
  11. while($set=odbc_fetch_array($result)){
  12.  
  13.  
  14.  
  15.  
  16. if($set['ODDNR1']=='H'){
  17. $tab_h[]=$set['ODDWNR'];
  18. }
  19.  
  20. if($set['ODDNR1']=='R' && !in_array($set['ODDWNR'],$tab_h)){
  21. $tab_r[]=$set['ODDWNR'];
  22. }
  23.  
  24. if($set['ODDNR1']=='P' && !in_array($set['ODDWNR'],$tab_h)&&
  25. !in_array($set['ODDWNR'],$tab_r)){
  26. $tab_p[]=$set['ODDWNR'];
  27. }
  28.  
  29. if($set['ODDNR1']=='A' && !in_array($set['ODDWNR'],$tab_h)&&
  30. !in_array($set['ODDWNR'],$tab_r)&& !in_array($set['ODDWNR'],$tab_p)) {
  31. $tab_a[]=$set['ODDWNR'];
  32. }
  33.  
  34. }
  35. print_r($set);
  36. echo 'Atrybut h: '.count($tab_h).'<br />';
  37. echo 'Atrybut r: '.count($tab_r).'<br />';
  38. echo 'Atrybut p: '.count($tab_p).'<br />';
  39. echo 'Atrybut a: '.count($tab_a).'<br />';

coś takiego?
nospor
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?
dopal
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
nospor
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
}

dopal
  1. $element = array()
  2.  
  3.  
  4. while($set=odbc_fetch_array($result)){
  5.  
  6.  
  7. if($set['ODDNR1']=='H'){
  8. $element['ODDNR1'] = H;
  9. }
  10.  
  11.  
  12. if($set['ODDNR1']=='R' && !in_array($element['ODDNR1'] or $element['ODDNR1']!='H'){
  13. $element['ODDNR1'] = R;
  14. }

Tak by to było na początku?
nospor
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;
mmmmmmm
Wstaw odpowiednie nawiasy do SQL (WHERE), bo teraz to kicha przeokrutna tam jest.
dopal
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


Cytat(mmmmmmm @ 12.02.2013, 11:06:42 ) *
Wstaw odpowiednie nawiasy do SQL (WHERE), bo teraz to kicha przeokrutna tam jest.

Właśnie nie wiem jak powinny one być wstawione.
nospor
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?
dopal
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ń.
nospor
Dziękuje. Bo juz się bałem że jako programista wink.gif

Tak jak pisałem
Nie:
  1. while($set=odbc_fetch_array($result)){
  2.  
  3.  
  4.  
  5.  
  6.  
  7. if($set['ODDNR1']=='H'){
  8.  
  9. $element['ODDNR1'] = H;
  10.  
  11. }
  12.  
  13.  
  14.  
  15.  
  16.  
  17. if($set['ODDNR1']=='R' && !in_array($element['ODDNR1'] or $element['ODDNR1']!='H'){
  18.  
  19. $element['ODDNR1'] = R;
  20.  
  21. }

a:
  1. while($set=odbc_fetch_array($result)){
  2.  
  3. $nazwaelementu = $set['tutaj nazwa pola z nazwa'];
  4.  
  5.  
  6.  
  7. if($set['ODDNR1']=='H'){
  8.  
  9. $element[$nazwaelementu] = 'H';
  10.  
  11. }
  12.  
  13.  
  14.  
  15.  
  16. a tutaj też nie żadne in_array(). Napisałem w ostatnim algorytmie co ma byc sprawdzane. Nie ma tam żadnej mowy o in_array(). Przeciez $element[$nazwaelementu] nie jest już tablicą a tekstem H R P lub A
  17. // if($set['ODDNR1']=='R' && !in_array($element['ODDNR1'] or $element['ODDNR1']!='H'){
  18.  
  19. // $element['ODDNR1'] = R;
  20.  
  21. }
dopal
  1. $element = array()
  2.  
  3.  
  4. while($set=odbc_fetch_array($result)){
  5.  
  6. $nazwaelementu = $row['ODDWNR'];
  7.  
  8. if($set['ODDNR1']=='H'){
  9. $element[$nazwaelementu] = H;
  10. }
  11.  
  12.  
  13. if($set['ODDNR1']=='R' && !in_array($element[$nazwaelementu] or $element[$nazwaelementu]!='H'){
  14. $element[$nazwaelementu] = R;
  15. }

Tak to ma być?
nospor
Moj poprzedni post i dopisek
Cytat
a tutaj też nie żadne in_array(). Napisałem w ostatnim algorytmie co ma byc sprawdzane. Nie ma tam żadnej mowy o in_array(). Przeciez $element[$nazwaelementu] nie jest już tablicą a tekstem H R P lub A
dopal
Programować, to ja mogę....programy w telewizorze,
a to robię bardziej dla swojej wygody w pracy.
nospor
  1. $element = array()
  2.  
  3.  
  4.  
  5.  
  6.  
  7. while($set=odbc_fetch_array($result)){
  8.  
  9.  
  10.  
  11. $nazwaelementu = $row['ODDWNR'];
  12.  
  13.  
  14.  
  15. if($set['ODDNR1']=='H'){
  16.  
  17. $element[$nazwaelementu] = 'H';
  18.  
  19. }
  20.  
  21.  
  22.  
  23.  
  24.  
  25. if($set['ODDNR1']=='R' && (!isset($element[$nazwaelementu] || $element[$nazwaelementu]!='H')){
  26.  
  27. $element[$nazwaelementu] = 'R';
  28.  
  29. }

analogicznie reszta
dopal
  1.  
  2. <?php
  3. $x=0;
  4.  
  5. $element = array()
  6.  
  7. while($set=odbc_fetch_array($result)){
  8.  
  9. $nazwaelementu = $row['ODDWNR']; //a nie powinno być $set?
  10.  
  11.  
  12. if($set['ODDNR1']=='H'){
  13. $element[$nazwaelementu] = 'H';
  14.  
  15. }
  16.  
  17.  
  18. if($set['ODDNR1']=='R' && (!isset($element[$nazwaelementu] || $element[$nazwaelementu]!='H')){
  19.  
  20. $element[$nazwaelementu] = 'R';
  21.  
  22. }
  23.  
  24. if($set['ODDNR1']=='P' && (!isset($element[$nazwaelementu] || $element[$nazwaelementu]!='H' AND $element[$nazwaelementu]!='R')){
  25.  
  26. $element[$nazwaelementu] = 'P';
  27.  
  28. }
  29.  
  30. if($set['ODDNR1']=='A' && (!isset($element[$nazwaelementu] || $element[$nazwaelementu]!='H' AND $element[$nazwaelementu]!='R' AND $element[$nazwaelementu]!='P')){
  31.  
  32. $element[$nazwaelementu] = 'A';
  33.  
  34. }
  35.  
  36. }
nospor
zamiast and używaj && - wizualnie mi to lepiej pasuje smile.gif

No. Teraz zrób
print_r($element);
poza pętlą, by sprawdzisz czy dobrze wynik się zrobił.
dopal
Parse error: syntax error, unexpected T_WHILE in D:\www\apache\htdocs\zest_magpoj.php on line 195

  1. while($set=odbc_fetch_array($result)){
  2.  
  3. $nazwaelementu = $set['ODDWNR'];

to jest ten fragment
Michasko
Brakuje Ci średnika przed 'while' :)
dopal
Cytat(Michasko @ 12.02.2013, 12:02:24 ) *
Brakuje Ci średnika przed 'while' smile.gif

Tak

Parse error: syntax error, unexpected T_BOOLEAN_OR, expecting ',' or ')' in D:\www\apache\htdocs\zest_magpoj.php on line 206

  1. if($set['ODDNR1']=='H'){
  2. $element[$nazwaelementu] = 'H';
  3.  
  4. }
  5.  
  6.  
  7. if($set['ODDNR1']=='R' && (!isset($element[$nazwaelementu] || $element[$nazwaelementu]!='H')){
  8.  
  9. $element[$nazwaelementu] = 'R';
  10.  
  11. }
Michasko
Linijka 7 - niedomknięty nawias okrągły. Musisz zacząć czytać komunikaty błędów...
nospor
Literowka.... isset ma sie szybko konczyc. Tak ma byc

if($set['ODDNR1']=='R' && (!isset($element[$nazwaelementu]) || $element[$nazwaelementu]!='H')){

$element[$nazwaelementu] = 'R';



}
dopal
Czytam, tylko ja już nad tym od wczoraj siedzę, po prawie nie przespanej nocy i już wielu rzeczy nie widze....

Robię print_r($element);
i otrzymuję:

Array ( [] => H )
nospor
$nazwaelementu = $row['ODDWNR']; //a nie powinno być $set?
Tak, powinno być set. Liczyłem na czyjąś intelignecję .... tongue.gif
dopal
Cytat(nospor @ 12.02.2013, 12:17:41 ) *
$nazwaelementu = $row['ODDWNR']; //a nie powinno być $set?
Tak, powinno być set. Liczyłem na czyjąś intelignecję .... tongue.gif

To chociaż tyle zobaczyłem....
nospor
No ale poprawiles? Nadal print_r nic ci nie zwraca?
dopal
zwraca,
Array ( [10080] => H [24170] => H [19811] => H [2740] => H [45367] => H [3449] => H [45368] => H [9203] => H [28328] => H [18349] => H [39714] => H [16422] => H [1202] => H [4251] => H [17584] => H [17380] => H [15659] => H [5118] => H [5213] => H [5993] => H [17000] => H [8943] => H [16333] => H [16695] => H [341] => H [2813] => H [3564] => H [13270] => H [8765] => H [17692] => H [4921] => H [16016] => H [40270] => H [5727] => H [12946] => H [131] => H [7630] => H [4805] => H [2120] => H [4405] => H [16990] => H [4089] => H [1722] => H [32466] => H [19078] => H [3420] => H [15471] => H [1653] => H [340] => H [5565] => H [13641] => H [25454] => H [35804] => H [6508] => H [14579] => H [4829] => H [14382] => H [4869] => H [5064] => H [2409] => H [3089] => H [716] => H [19079] => H [19080] => H [570] => H [1261] => H [2357] => H [2341] => H [5552] => H [13096] => H [23320] => H [4266] => H [41436] => H [12318] => H [314] => H [24795] => H [38379] => H [5259] => H [22842] => H [24002] => H [4233] => H [4638] => H [8640] => H [22750] => H [1863] => H [565] => H [9369] => H [40072] => H [16546] => H [681] => H [16839] => H [16383] => H [9869] => H [32009] => H [53] => H [24997] => H )

taki fragemnt, czyli chyba OK,

  1.  
  2. $tab_h=array();
  3. $tab_r=array();
  4. $tab_p=array();
  5. $tab_a=array();
  6.  
  7. foreach ($element as $el => $atr){
  8. //a tutaj w zaleznosci czy $atr jest rowny h r p czy a to dodajesz $el do tablicy h r p lub a
  9. }

teraz tak?
nospor
hm.... czy twoje nazwy elementu to liczby ala 10080?

Tak, teraz druga cześc algorytmu

ps: wynika, ze masz same H, zero innych
dopal
Tak, nazwy elementu to liczby, a do tych liczb przypisane jest nazwisko i imie, te liczby to takie id osoby.
Owszem wybrałem mały przedział czasowy 1 dzień i są tam akurat same H,
Przy wiekszym były pozostałe atrybuty również

  1. $tab_h=array();
  2. $tab_r=array();
  3. $tab_p=array();
  4. $tab_a=array();
  5.  
  6. foreach ($element as $el => $atr){
  7. if ($atr=='h') {
  8. $tab_h[] =$el++;}
  9. }
  10.  
  11.  

coś takiego?
nospor
nie: $tab_h[] =$el++;
a: $tab_h[] =$el;

Juz nawet nie chce pytac skad pomysł na te plusy...

nie: $atr=='h'
a: $atr=='H'

Przecież masz z duzych liter w bazie. Przykładaj się proszę troszkę bardziej.
dopal
I lepiej rzebyś nie pytał sciana.gif
  1. $tab_h=array();
  2. $tab_r=array();
  3. $tab_p=array();
  4. $tab_a=array();
  5.  
  6. foreach ($element as $el => $atr){
  7. if ($atr=='H') {
  8. $tab_h[] =$el;}
  9.  
  10. if ($atr=='R') {
  11. $tab_r[] =$el;}
  12.  
  13. if ($atr=='P') {
  14. $tab_p[] =$el;}
  15.  
  16. if ($atr=='A') {
  17. $tab_a[] =$el;}
  18. }
  19.  
  20.  
  21. }
  22. print_r($element);
  23. echo 'Atrybut h: '.count($tab_h).'<br />';
  24. echo 'Atrybut r: '.count($tab_r).'<br />';
  25. echo 'Atrybut p: '.count($tab_p).'<br />';
  26. echo 'Atrybut a: '.count($tab_a).'<br />';
nospor
Rozumiem, że już działa?
dopal
Wyniki otrzymuję, więc chyba jest ok.
Pozstaje jeszcze sprawa z zapytaniem
  1. $query="SELECT DADWNR, DADWNZ, DADWIM, DADWPS, DADWA1, DADWA2, DAPLNR, ODDNR1, ODDWNR, ODDNNR, ODDNDT FROM DAWCY
  2. INNER JOIN ODDANIA on DADWNR=ODDWNR AND DAPLNR=ODPLNR
  3. WHERE
  4. ODDNDT Between '20121221' And '20121231' AND ODDNKD='E5' OR
  5. ODDNDT Between '20121221' And '20121231' AND ODDNKD='EA' OR
  6. ODDNDT Between '20121221' And '20121231' AND ODDNKD='EK' OR
  7. ODDNDT Between '20121221' And '20121231' AND ODDNKD='EP' ";

jak ma ono wyglądac by było grupowanie po ODDWNR, ODDNR1
nospor
A w jakim celu?
dopal
To jest ten fragment co pisałem wcześniej:

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


Nie wiem czy to jasne.
nospor
Chyba właśnie zdurniałem..... to niby co my do tej pory robiliśmy? Przecież to jest właśnie to co do tej pory robiliśmy, to co napisałeś, że już działa.
phpion
Nie czytałem całego wątku, ale czy zapytanie przypadkiem nie jest błędne pod kątem logicznym? Brakuje przecież nawiasów między ORami:
  1. $query="SELECT DADWNR, DADWNZ, DADWIM, DADWPS, DADWA1, DADWA2, DAPLNR, ODDNR1, ODDWNR, ODDNNR, ODDNDT FROM DAWCY
  2. INNER JOIN ODDANIA on DADWNR=ODDWNR AND DAPLNR=ODPLNR
  3. WHERE
  4. (ODDNDT Between '20121221' And '20121231' AND ODDNKD='E5') OR
  5. (ODDNDT Between '20121221' And '20121231' AND ODDNKD='EA') OR
  6. (ODDNDT Between '20121221' And '20121231' AND ODDNKD='EK') OR
  7. (ODDNDT Between '20121221' And '20121231' AND ODDNKD='EP') ";

Można to również uprościć bo w każdej parze warunków pierwszy z nich się powtarza. Powinno więc również zadziałać:
  1. $query="SELECT DADWNR, DADWNZ, DADWIM, DADWPS, DADWA1, DADWA2, DAPLNR, ODDNR1, ODDWNR, ODDNNR, ODDNDT FROM DAWCY
  2. INNER JOIN ODDANIA on DADWNR=ODDWNR AND DAPLNR=ODPLNR
  3. WHERE
  4. ODDNDT Between '20121221' And '20121231' AND ODDNKD IN ('E5', 'EA', 'EK', 'EP')";
dopal
Po części tak, ale ( może się mylę)
Jesli np. kowalski oddał w ciągu roku krew 5 razy
czyli
kolwalski H
kowalski R
kowalski H
kowalski H
kowalski H

to on w wybranym przedziale czasowym ma być policzony raz do H

Zrób to jeszcze z tym grupowaniem w zapytaniu, a ja sobie posprawdzam co wychodzi prawidłowo.
phpion
Cytat(dopal @ 12.02.2013, 13:07:25 ) *
Zrób to jeszcze z tym grupowaniem w zapytaniu, a ja sobie posprawdzam co wychodzi prawidłowo.

laugh.gif mocne
dopal
Cytat(phpion @ 12.02.2013, 13:09:59 ) *
laugh.gif mocne

Może i mocne...a może złe wyrażenie
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.