Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Problem z mysql_fetch_assoc
Forum PHP.pl > Forum > Przedszkole
wkozak
Witam,
mam problem z danymi z tablicy jak w tytule. Napisałem taki skrypt:

Kod
<?php
mysql_connect("localhost" , "root" , "") or die ("nie ma bazy");
mysql_select_db("dbd") or die ("nie ma bazy dbd");

$pyt=mysql_query("select f1 , wojewodztwo , count(wojewodztwo) as zlicz from pl  group by wojewodztwo , f1") or die ("blad w pytaniu");


while ($r =mysql_fetch_assoc($pyt)) {

echo "<p>".$r['f1']." ".$r['wojewodztwo']." ".$r['zlicz']."</p>";

}


?>


Chciałbym zapisać f1 (kilkanaście pozycji) i wojewodztwo (16) do zmiennych, żeby ich użyć nie tylko do wyświetlenia na ekranie, ale choćby do jakiegoś wykresu. Ilość pytań SQLowych byłaby dosyć duża... Jak wyciągnąć to z tablicy?
sadistic_son
  1. $f1=array();
  2. $woj=array();
  3.  
  4. while ($r =mysql_fetch_assoc($pyt)) {
  5.  
  6. echo "<p>".$r['f1']." ".$r['wojewodztwo']." ".$r['zlicz']."</p>";
  7. $f1[]=$r['f1'];
  8. $woj[]=$r['wojewodztwo'];
  9. }
Teraz masz 2 nowe tablice zawierajace wojewodztwo i f1.
wkozak
Dzięki za pomoc. Dobrze że to przedszkole... Nie znalazłem nigdzie niczego na temat tablic oprócz sortowania i wyświetlania zawartości. A chciałem coś obliczyć np % 'aa' dla każdego 'woj', % 'bb' dla każdego 'woj' itd :


f1 | woj | zlicz
aa |w1 |10
bb |w3 |23
aa |w2 |12
cc |w1 |12


Valdi_B
Z "tabelki wyników", które podałeś powyżej widzę, że tak w zakresie "f1" jak i "woj" masz powtórzenia.
Jeżeli takie dane będziesz ładować do tablic w pamięci, to będziesz miał w nich powtórzenia.
Czy to jest to o co Ci chodzi?

Bo jeżeli nie, to powinieneś:
1. Zrobić 2 oddzielne instrukcje SELECT DISTINCT (raz "f1" i raz "woj").
2. Z każdej z tych instrukcji odczytać dane (bez powtórzeń do tablic w pamięci.
wkozak
  1. Chyba nie można mówić, że to powtórzenia:
  2. f1 |woj |zlicz
  3. aa |w1 |10
  4. aa |w2 |12
  5.  
  6. inne wartości kolumny woj i zlicz, a przecież jakoś chce obliczyć % np dla w1% = 10/22 a w2%=12/22. Te wartości są z bazy, w tabeli MySql f1 i woj powtarzają się cały czas (np aa=>w2 12 razy bo tyle razy użytkownik kliknął radiobutton ).
  7. Trzy linijki kodu z pierwszego postu wyświetlają mi wartości z tablicy php, ale dalej nie wiem jak zrobić proste obliczenia. Konieczny jest SQL?
Valdi_B
Wartości województwa rzeczywiście nie będą się powtarzać, bo o to zadba fraza GROUP BY.
Co do "f1" - z powyższego przykładu wynika, że powtórzenia są.

Zastanawia mnie, że w kwerendzie nie masz grupowania na "f1".
Nie jestem pewny, ale tak jak masz zredagowaną kwerendę, to dla każdej grupy rekordów z danego województwa jako f1 dostajesz wartość z 1-go rekordu za dane województwo (sprawdź za wybrane województwo bez grupowania).
Czy taki jest Twój zamiar?

A może powinieneś zrobić grupowanie także na "f1"
(pytanie w jakiej kolejności: GROUP BY f1, woj - czy odwrotnie).
Pamiętaj, że GROUP BY wymusza niejawnie sort na podane kolumny.

A może we wszystkich rekordach z danego województwa masz takie same wartości f1, wtedy nie ma sprawy.

Co do naliczania podsumowań - poczytaj o GROUP BY ... WITH ROLLUP
http://dev.mysql.com/doc/refman/5.1/en/gro...-modifiers.html
Może opisany tu mechanizm naliczania podsumować to coś, czego Ci trzeba?
wkozak
.
Cytat
Co do "f1" - z powyższego przykładu wynika, że powtórzenia są.

no nie wiem.... a inne woj?

Cytat
Zastanawia mnie, że w kwerendzie nie masz grupowania na "f1".

jest grupowanie


Valdi_B
Rzeczywiście, z brakiem grupowania wg f1 "przestrzeliłem" - przepraszam.
W tej sytuacji wyniki będziesz miał w stylu:

woj | f1 | zlicz
========
w1 | aa | n1
w1 | bb | n2
w1 | cc | n3
w2 | aa | n4
w2 | bb | n5
w2 | dd | n6
itd.

Świadomie zmieniłem kolejność kolumn, aby było widać sortowanie (bo GROUP BY niejawnie ten sort wprowadza).

Jeżeli chcesz mieć w tej tabelce także procenty, to:
1. Zacznij od SELECT COUNT(*) FROM pl - odczytasz liczbę wszystkich rekordów,np. do zmiennej $lwr (liczba wszystkich rekordów).
2. Tworząc tabelę na stronie, dodaj kolumnę = zlicz / $lwr - jaki procent wszystkich rekordów stanowią rekordy za dane woj / f1.

Co do robienia wykresów - chyba trzeba zrobić coś w stylu:
1. Na głównej stronie pełna tabelka za wszystkie woj / f1.
2. Poniżej linki za wszystkie woj.
3. Jeszcze niżej linki za wszystkie f1.
(generujące stosowne wykresy - do ustalenia gdzie).

Wtedy jednak, aby wygenerować te linki, musisz mieć listę woj bez powtórzeń i listę f1, też bez powtórzeń.
Dane do tych list musisz ciągnąć z bazy oddzielnymi SELECT DISTINCT, bo Twoja instrukcja SELECT wyciągnie te dane z powtórzeniami.

Sprawdź te instrukcje SQL "w oderwaniu od strony", wydając je np. spod phpMyAdmin.
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.