Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

3 Stron V   1 2 3 >  
Reply to this topicStart new topic
> [MySQL][PHP]Jak wyliczyć wyniki z zapytania
dopal
post
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

  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. ';
  7. ?>

W jaki sposób można to zrobić, proszę o jakieś podpowiedzi i wskazówki.
Go to the top of the page
+Quote Post
nospor
post
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.
Go to the top of the page
+Quote Post
dopal
post
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.
Go to the top of the page
+Quote Post
mmmmmmm
post
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.
Go to the top of the page
+Quote Post
dopal
post
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

  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. ?>


Ten post edytował dopal 12.02.2013, 08:26:36
Go to the top of the page
+Quote Post
nospor
post
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
}
Go to the top of the page
+Quote Post
dopal
post
Post #7





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 9.02.2009

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


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
Go to the top of the page
+Quote Post
nospor
post
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.
Go to the top of the page
+Quote Post
dopal
post
Post #9





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 9.02.2009

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


  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?
Go to the top of the page
+Quote Post
nospor
post
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.
Go to the top of the page
+Quote Post
dopal
post
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...

  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?
Go to the top of the page
+Quote Post
nospor
post
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?
Go to the top of the page
+Quote Post
dopal
post
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
Go to the top of the page
+Quote Post
nospor
post
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
}

Go to the top of the page
+Quote Post
dopal
post
Post #15





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 9.02.2009

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


  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?
Go to the top of the page
+Quote Post
nospor
post
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;
Go to the top of the page
+Quote Post
mmmmmmm
post
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.
Go to the top of the page
+Quote Post
dopal
post
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


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.
Go to the top of the page
+Quote Post
nospor
post
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?
Go to the top of the page
+Quote Post
dopal
post
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ń.
Go to the top of the page
+Quote Post
nospor
post
Post #21





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Dziękuje. Bo juz się bałem że jako programista (IMG:style_emoticons/default/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. }
Go to the top of the page
+Quote Post
dopal
post
Post #22





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 9.02.2009

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


  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ć?
Go to the top of the page
+Quote Post
nospor
post
Post #23





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 9.02.2009

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


Programować, to ja mogę....programy w telewizorze,
a to robię bardziej dla swojej wygody w pracy.
Go to the top of the page
+Quote Post
nospor
post
Post #25





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 9.02.2009

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


  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. }
Go to the top of the page
+Quote Post
nospor
post
Post #27





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




zamiast and używaj && - wizualnie mi to lepiej pasuje (IMG:style_emoticons/default/smile.gif)

No. Teraz zrób
print_r($element);
poza pętlą, by sprawdzisz czy dobrze wynik się zrobił.
Go to the top of the page
+Quote Post
dopal
post
Post #28





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 9.02.2009

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


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





Grupa: Zarejestrowani
Postów: 283
Pomógł: 31
Dołączył: 10.01.2006
Skąd: Działoszyn

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


Brakuje Ci średnika przed 'while' :)

Ten post edytował Michasko 12.02.2013, 12:03:05
Go to the top of the page
+Quote Post
dopal
post
Post #30





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 9.02.2009

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


Cytat(Michasko @ 12.02.2013, 12:02:24 ) *
Brakuje Ci średnika przed 'while' (IMG:style_emoticons/default/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. }
Go to the top of the page
+Quote Post
Michasko
post
Post #31





Grupa: Zarejestrowani
Postów: 283
Pomógł: 31
Dołączył: 10.01.2006
Skąd: Działoszyn

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


Linijka 7 - niedomknięty nawias okrągły. Musisz zacząć czytać komunikaty błędów...
Go to the top of the page
+Quote Post
nospor
post
Post #32





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Literowka.... isset ma sie szybko konczyc. Tak ma byc

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

$element[$nazwaelementu] = 'R';



}
Go to the top of the page
+Quote Post
dopal
post
Post #33





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 9.02.2009

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


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 )
Go to the top of the page
+Quote Post
nospor
post
Post #34





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




$nazwaelementu = $row['ODDWNR']; //a nie powinno być $set?
Tak, powinno być set. Liczyłem na czyjąś intelignecję .... (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
dopal
post
Post #35





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 9.02.2009

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


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ę .... (IMG:style_emoticons/default/tongue.gif)

To chociaż tyle zobaczyłem....
Go to the top of the page
+Quote Post
nospor
post
Post #36





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




No ale poprawiles? Nadal print_r nic ci nie zwraca?
Go to the top of the page
+Quote Post
dopal
post
Post #37





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 9.02.2009

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


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?
Go to the top of the page
+Quote Post
nospor
post
Post #38





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




hm.... czy twoje nazwy elementu to liczby ala 10080?

Tak, teraz druga cześc algorytmu

ps: wynika, ze masz same H, zero innych
Go to the top of the page
+Quote Post
dopal
post
Post #39





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 9.02.2009

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


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?

Ten post edytował dopal 12.02.2013, 12:38:13
Go to the top of the page
+Quote Post
nospor
post
Post #40





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.
Go to the top of the page
+Quote Post
dopal
post
Post #41





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 9.02.2009

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


I lepiej rzebyś nie pytał (IMG:style_emoticons/default/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 />';
Go to the top of the page
+Quote Post
nospor
post
Post #42





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Rozumiem, że już działa?
Go to the top of the page
+Quote Post
dopal
post
Post #43





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 9.02.2009

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


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





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




A w jakim celu?
Go to the top of the page
+Quote Post
dopal
post
Post #45





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 9.02.2009

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


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.
Go to the top of the page
+Quote Post
nospor
post
Post #46





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.
Go to the top of the page
+Quote Post
phpion
post
Post #47





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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')";
Go to the top of the page
+Quote Post
dopal
post
Post #48





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 9.02.2009

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


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.
Go to the top of the page
+Quote Post
phpion
post
Post #49





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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.

(IMG:style_emoticons/default/laugh.gif) mocne
Go to the top of the page
+Quote Post
dopal
post
Post #50





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 9.02.2009

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


Cytat(phpion @ 12.02.2013, 13:09:59 ) *

Może i mocne...a może złe wyrażenie
Go to the top of the page
+Quote Post
nospor
post
Post #51





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
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
I kod, który z Tobą męczę od dwóch dni to własnie robi.... przypisuje tylko raz.
Go to the top of the page
+Quote Post
dopal
post
Post #52





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 9.02.2009

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


Ok, chyba masz rację...za duzo tego było od wczoraj i głowa siada....
Dzieki, gdyby cos to się odezwę.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 24.08.2025 - 04:24