Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [mySQL] lista zapytan
itsme
post 10.04.2003, 12:30:32
Post #1





Grupa: Zarząd
Postów: 1 512
Pomógł: 2
Dołączył: 22.04.2002
Skąd: Koszalin




Witam Szanowne Grono,
Przegladajac wiele kursow mySQL-a zauwazylem, ze wiekszosc konczy sie wtedy gdy sie robi ciekawie (niestety). Dlatego zwracam sie do Was z moim pomyslem:
1. nie jest to kurs mySQL-a
2. bedzie to male faq
3. pomijamy pytania typu jak wybrac dane z jednej tabeli - czyli to co jest w kursach podstawowych
4. jezeli ktos chcedodac cos od siebie nie oponuje - zapraszam

dane wyjsciowe:
jest 5 tabel
- <b>klient</b> - [id].[nazwa]
- <b>faktura</b> - [id].[data_wystawienia].[id_klienta]
- <b>faktura_pozycje</b> - [id].[id_faktury].[id_towaru].[ilosc].[kwota_jednostkowa_netto].
.[stawka_vat].[wartosc_vat].[wartosc_netto].[kwota_brutto].[ilosc]
- <b>towar</b> - [id].[nazwa].[jm].[id_gupy_towarowej]
- <b>grupa_towarowa</b> - [id].[nazwa]

z tych tabel uzytkownik chce wyciagnac nastepujace dane:
<b>A</b> sume kwot wartosc_netto sprzedanych towarow z podzialem na kwartaly
<b>B</b> ilosc poszczegolnych stawek podatku VAT z podzialem na miesiace (wynik: 7% - kwieciec 2003 - 13 razy; oczywiscie takie cos nigdy nie jest potrzebne)
<b>C</b> sume kwot podatku VAT z poszczegolnych stawek podatku VAT z podzialem na miesiace (wynik: 7% - kwieciec 2003 - 2045.33 zł)
<b>D</b> ilosc faktur wystawionych na wszystkich klientow z podzialem na klientow i miesiace - pole nadrzedne klient | miesiac | ilosc
<b>E</b> suma wartosc_netto i ilosc z podzialem na sprzedaz danego towaru oraz miesiace
<b>F</b> Ilosc faktur w ktorych pokazal sie dany (wybrany) towar
<b>G</b> Wybranie nazwy_towaru/ilosc sprzedanego w roku 2002 danemu klientowi z danej grupy towarowej (dane znane id klienta, id grupy towarowej)

to sa pytania ktore przyszly mi do glowy. odpowiedz na nie daje duzo mozliwosci innym uzytkownikom. daje mozliwosc sprawdzennia swojej wiedzy i mam nadzieje ze wywola mala merytoryczna dyskusje.

INSTRUKCJA:
- jak udzielamy odpowiedzi - procz zapytania mySQL chcialbym aby pojawilo sie jego wytlumaczenie (SELECT FROM WHERE ORDER BY wykluczam) oto przyklad
Cytat
<b>ODP A</b>
SELECT ..... FROM .... WHERE .... ORDER BY DESC ....
DESC - oznacza sortowanie w ......

mam nadzieje ze to pomoze innym (zreszta mi tez)
po wyczerpaniu tematu mozna dodawac inne przyklady inne uklady tabel
Do posta jest ankieta chce wiedziec co sadzicie o tym pomysle.


--------------------
brak sygnaturki rowniez jest sygnaturką
Go to the top of the page
+Quote Post
scanner
post 10.04.2003, 16:21:26
Post #2





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




2xTAK, ale czy mógłbyś zamieścić kod SQL generujący tabele? Byłoby szybciej, i bardziej "jednolicie".
Update Skleroza nie boli. Do kodu oczywiście przydałyby sie INSERTy z przykładowymi danymi.


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
itsme
post 10.04.2003, 19:19:10
Post #3





Grupa: Zarząd
Postów: 1 512
Pomógł: 2
Dołączył: 22.04.2002
Skąd: Koszalin




ok nastapila zmiana z ogloszenie na przyklejony

zgodnie z glosami w postaci postow na forum oraz informacjami na PW przedstawiam Wam plik ktory zawiera wszystko, aby taka baze stworzyc u siebie lacznie z danymi. Zobaczyc w przegladarce mozna TUTAJ.

Zaznaczam jednoczesnie iz to nie jest baza ktora gdzies funkcjonuje. Zrobilem ja na Wasze zyczenie jak i w celu wsparcia Waszych prac. Dlatego prosze o przymkniecie oka na ewentualne bledy (oczywiscie wykazanie bedzie mialo znaczenie).
Wszystkie tabele zawieraja przedrostek php_*.


Pozdrawiam i zycze owocnego myslenia


_____________________________________________
*DeyV - 5 czerwa - powyższe linki zostały aktualizowane
Go to the top of the page
+Quote Post
DeyV
post 12.04.2003, 19:29:27
Post #4





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




No to zaczynamy.
Wyświetlanie grup towarów, oraz ilości należących do nich produktów:
  1. SELECT
  2. `php_grupa_towarowa`.`id`,
  3. `php_grupa_towarowa`.`nazwa`,
  4. COUNT(`php_towar`.`id`) AS `ile`
  5. FROM `php_grupa_towarowa` LEFT JOIN `php_towar` ON (`php_towar`.`id_gupy_towarowej` = `php_grupa_towarowa`.`id`)
  6. GROUP BY `php_grupa_towarowa`.`id`

1. JOIN - dołącza tablicę z towarami;
2. LEFT - powoduje, że wyświetlaja się również grupy, które nie mają żadnych produktów;
3. COUNT - zliczanie ilości produktów znajdujących sie w danej grupie;
4. GROUP BY - by móc zliczyć ile jest produktów w danej grupie towarowej, musimy je pogrupować, tu względem `id` grupy towarowej;

ps.
Gdy wpadniecie na pomysł czytelniejszego wytłumaczenia podanych funkcji - nie krępować sie - edytować, lub proszę o info na PW


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
DeyV
post 12.04.2003, 19:58:34
Post #5





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




A teraz coś innego:
Ilość faktur, które pojawiły się w poszczególnych miesiącach. Pokazujemy tylko te miesiace i lata, w których coś sie działo:
  1. SELECT
  2. count( `id` ) ,
  3. MONTH ( `data_wystawienia` ) AS `msc` ,
  4. YEAR( `data_wystawienia` ) AS `rok`
  5. FROM `php_faktura` GROUP BY `msc` , `rok`

1. MONTCH - wyciaga numer miesiąca z daty;
2. YEAR - rok z daty;
3. GROUP BY - grupujemy zarówno wzglądem miesiaca, jak i roku. Dlaczego? Gdyż nie chcemy, by zliczane były faktury zarówno z maja 2002 jak i maja 2003. Mają być traktowane osobno.
_________________________________________________
A gdyby potrzebna była ilość faktur z konkretnego miesiąca, np. stycznia, roku 2003?
  1. SELECT
  2. count( id ) ,
  3. MONTH ( `data_wystawienia` ) AS `msc` ,
  4. YEAR( `data_wystawienia` ) AS `rok`
  5. FROM `php_faktura` WHERE ( MONTH ( `data_wystawienia` ) = '1' )
  6. GROUP BY `msc` , `rok`


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
divx4u.pl
post 30.04.2003, 10:40:24
Post #6





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 3.03.2003
Skąd: Szczecino

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


nie lepiej pole daty zmienic na tym timestap ?


--------------------
pozdrafiam andrius
http://divx4u.pl
gg://1675677
Go to the top of the page
+Quote Post
kris_
post 30.04.2003, 16:07:52
Post #7





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 21.02.2003

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


Cytat
  1. SELECT count(`id`), MONTH(`data_wystawienia`) AS `msc`, YEAR(`data_wystawienia`) AS `rok`
  2. FROM `php_faktura` GROUP BY `msc`, `rok`;

Dzieki za podpowiedz mialem zapytanie do bazy o sprzedaż miesięczną i zamiast zadawać zapytanie oddaty do daty dla każdego miesiąca zadałem zapytanie podobne do twojego i wydajność wzrosła 3 krotnie winksmiley.jpg

Mi przychodzi jeszcze do głowy:
-Klienci którzy nie zakupili żadnego towaru w danym miesiącu

  1. CREATE TEMPORARY TABLE bzium SELECT id_klienta
  2. FROM faktura WHERE data_wystawienia>="2003-03-01" AND data_wystawienia<="2003-03-31" GROUP BY id_klienta;
  3.  
  4. SELECT klient.id_klienta
  5. FROM bzium RIGHT JOIN klient ON klient.id_klienta=bzium.id_klienta WHERE bzium.id_klienta IS NULL;


uff winksmiley.jpg Domyślam się że da się prościej bo u mnie porównanie 10000 klientów trwało 50 sec winksmiley.jpg_
po dodaniu indexu na tablice tymczasową 0.42sec ;P
CREATE INDEX tmpbzium ON bzium (id_klienta);

-Klienci ktorzy nie zakupują jakiegoś konkretnego towaru
To podobniejak wyżej tylko inna tabela tymczasowa

-Średnia cena towaru na klienta
-Procentowo ile dany kleint dokonał zakupów w stosunku do całkowitych zakupów miesięcznych i na dane produkty
Go to the top of the page
+Quote Post
DeyV
post 30.04.2003, 17:30:05
Post #8





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




1. Myślę, że nieco lepiej wyglada to tak:
  1. CREATE TEMPORARY TABLE `tmp`
  2. SELECT `php_klient`.`id` ,
  3. `php_klient`.`nazwa` ,
  4. count( `php_faktura`.`id` ) AS `ile`
  5.  
  6. FROM `php_klient` INNER JOIN `php_faktura` ON ( `php_klient`.`id` = `php_faktura`.`id` )
  7. WHERE MONTH (`php_faktura`.`data_wystawienia` ) = 1
  8. GROUP BY `php_klient`.`id` LIMIT 0, 30
  9.  
  10. SELECT *
  11. FROM `tmp` WHERE `ile`= '0';
choć przyznam sie, że mam problem z wykorzystanim takich konstrukcji w php.
Tylko jak do takiego rozwiązania dodać indexy?


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
uboottd
post 30.06.2003, 11:49:32
Post #9





Grupa: Zarejestrowani
Postów: 384
Pomógł: 0
Dołączył: 3.04.2003
Skąd: Chorzow

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


Troche prosta ta baza... No ale dobra. Mam zadanie:

Zalozmy ze w tabeli php_faktura jest pole wartosc_szacunkowa typu int (nie wnikajcie w sens pola).

Zadanie:
Zwrocic dla kazdego klienta sume wartosci szacunkowych i sume wartosci netto wszystkich faktur jakie klient ma. Jednym zapytaniem w MySQLu, jesli to mozliwe.
Go to the top of the page
+Quote Post
FiDO
post 18.08.2003, 23:05:03
Post #10





Grupa: Przyjaciele php.pl
Postów: 1 717
Pomógł: 0
Dołączył: 12.06.2002
Skąd: Wolsztyn..... Studia: Zielona Góra

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


Nudzilem sie troche, przypomnial mi sie ten topic, wiec sprobowalem swoich sil...
Zajmowalem sie tylko zadaniami z pierwszego posta w tym topicu.
Oto rozwiazania (mam nadzieje ze dobre smile.gif ):



A - sume kwot wartosc_netto sprzedanych towarow z podzialem na kwartaly
---------
  1. SELECT SUM(p.wartosc_netto) suma, # sumujemy wartosc netto
  2. CASE WHEN MONTH(data_wystawienia) BETWEEN 1 AND 3 THEN "I kwartał"
  3. WHEN MONTH(data_wystawienia) BETWEEN 4 AND 6 THEN "II kwartał"
  4. WHEN MONTH(data_wystawienia) BETWEEN 7 AND 9 THEN "III kwartał"
  5. WHEN MONTH(data_wystawienia) BETWEEN 10 AND 12 THEN "IV kwartał"
  6. END kwartal # dajemy na to alias'a kwartal, aby moc pogrupowac
  7. FROM `php_faktura_pozycje` p
  8. LEFT JOIN `php_faktura` f ON ( p.id_faktury = f.id )
  9. GROUP BY kwartal;
  10. # grupujemy po kwartale, w celu uzyskania kwartalnego zestawienia


B - ilosc poszczegolnych stawek podatku VAT z podzialem na miesiace
---------
  1. SELECT `stawka_vat`, COUNT(p.id) ile, # pobieramy stawke i jej ilosc
  2. CONCAT_WS(" ",MONTHNAME(data_wystawienia),YEAR(data_wystawienia)) DATA
  3. FROM `php_faktura_pozycje` p
  4. LEFT JOIN `php_faktura` f ON ( p.id_faktury = f.id )
  5. GROUP BY MONTH(data_wystawienia), YEAR(data_wystawienia), stawka_vat;
  6. # grupujemy po roku i miesiacu (zeby kazdy miesiac kazdego roku byl liczony osobno)
  7. # i po stawce vat, zeby otrzymac zestawienie


C - sume kwot podatku VAT z poszczegolnych stawek podatku VAT z podzialem na miesiace
---------
  1. SELECT `stawka_vat`, SUM(p.wartosc_vat) suma,
  2. CONCAT_WS(" ",MONTHNAME(data_wystawienia),YEAR(data_wystawienia)) DATA
  3. FROM `php_faktura_pozycje` p
  4. LEFT JOIN `php_faktura` f ON ( p.id_faktury = f.id )
  5. GROUP BY MONTH(data_wystawienia), YEAR(data_wystawienia), stawka_vat;
  6. # to samo co w poprzednim, tylko ze nie zliczamy ilosci tylko sumujemy wartosci


D - ilosc faktur wystawionych na wszystkich klientow z podzialem na klientow i miesiace - pole nadrzedne klient | miesiac | ilosc
---------
  1. SELECT
  2. k.nazwa klient, MONTHNAME( f.data_wystawienia ) miesiac, COUNT( f.id ) ilosc
  3. FROM `php_faktura` f
  4. INNER JOIN `php_klient` k ON ( f.id_klienta = k.id )
  5. GROUP BY klient,miesiac
  6. # grupujemy wg klient, miesiac, zeby kazdy miesiac kazdego klienta byl
  7. # liczony osobno


F - Ilosc faktur w ktorych pokazal sie dany (wybrany) towar
---------
  1. SELECT
  2. COUNT(DISTINCT id_faktury) `ile`
  3. FROM `php_faktura_pozycje` p
  4. WHERE p.`id_towaru` = 5 # dane id_towaru
  5. # musi byc DISTINCT, zeby tylko raz liczyc dany towar jesli sie pojawil wiecej niz raz na jednej fakturze
  6.  
  7.  
  8. SELECT
  9. `t`.`nazwa` `towar`, # pobieramy nazwe towaru
  10. COUNT(DISTINCT id_faktury) `ile` # ilosc unikalnych (DISTINCT) wartosci id_faktury
  11. FROM `php_faktura_pozycje` p
  12. LEFT JOIN `php_towar` t ON (`t`.`id` = `p`.`id_towaru`)
  13. WHERE p.`id_towaru` = 5 # dane id_towaru
  14. GROUP BY `towar`;
  15. # to samo, tylko ze jeszcze z pobieraniem nazwy tego towaru

Sory, ze opisy troche ascetyczne, ale robilem to wczoraj o 4 nad ranem smile.gif
Zapomnialem nawet o ostatnim punkcie G (bez skojarzen tongue.gif)


--------------------
Brak czasu :/
Go to the top of the page
+Quote Post
peyn
post 27.09.2004, 11:41:43
Post #11





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 20.09.2004
Skąd: Konin

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


Cytat(DeyV @ 2003-04-12 20:58:34)
A gdyby potrzebna była ilość faktur z konkretnego miesiąca, np. stycznia, roku 2003?
  1. SELECT
  2.      count( id ) ,
  3.      MONTH (  `data_wystawienia`  ) AS  `msc` ,
  4.      YEAR(  `data_wystawienia`  )  AS  `rok` 
  5. FROM  `php_faktura` 
  6. WHERE (  MONTH (  `data_wystawienia`  ) =  '1' )
  7. GROUP  BY  `msc` ,  `rok`

Hmm, czy tutaj przypadkiem nie nalezy w warunku podac jeszcze
YEAR(`data_wystawienia`) = '2003'

Bo teraz tak jak jest to wyswietli wszystkie faktury ze stycznia ale wszystkich lat - czyz nie?
Go to the top of the page
+Quote Post
oldek
post 19.12.2004, 09:12:57
Post #12





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 7.06.2004

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


Wszystko to jest piękne i ładne, tyle że w nierealnym świecie, gdzie nie ma Balcerowicza i jego kamratów rolleyes.gif W naszej cudnej rzeczywistości tak jednak nie jest, zatem należy tu czym prędzej wprowadzić poprawki koncepcyjne, gdyż przyjmując powyższe założenia narażamy się albo na zemstę zdesperowanych sprzedawców worriedsmiley.gif albo na odwiedziny organów zaprzyjaźnionych z urzędem skarbowym (prokurator, policja, komornik etc. aaevil.gif ). Tak więc by nie pozostał ten trud jedynie uroczym ćwiczeniem umysłowym, lub, co gorsza, wiodącym na manowce znakiem, należałoby już w fazie koncepcyjnej poczynić stosowne korekty.

1) vat (hłe hłe hłe... vat...) należy przypisać do grup towarowych i stamtąd ściągać na fakturę. Przy obecnej strukturze jest on wprowadzany arbitralnie przy każdej pozycji przez użytkownika wystawiającego fakturę, co jest zaproszeniem wprost do przekrętów w rozumieniu ustawy karno-skarbowej. Pół biedy gdy będzie to hurtownia mat. budowlanych, w której vat na wszystko jeden, ale w branży spożywczej, gdzie wystepują dokładnie wszystkie stawki, żywot programu (i programisty aaevil.gif ) byłby niepomiernie krótki...

2) a teraz takie ćwiczonko: mamy towary o wartości 1 grosza w stawce 22%. Liczymy: 1 towar = 1 gr netto + 0 gr vat (zgodnie z regułami zaokrąglania). Sprzedajemy 100 różnych takich towarów i mamy : 100 gr netto + 0 gr vat worriedsmiley.gif (a Balcerowicz & Co. już zacierają rączki aaevil.gif ) Zatem do tabeli 'faktury' należy przerzucić pola 'podatek_vat' z tabeli 'faktura_pozycje' i do której są sumowane pozycje netto z 'faktura_pozycje'. Dopiero tam następuje przeliczenie należnego podatku vat zbiorczo od wszystkich pozycji na fakturze...

To tyle co mi się nasunęło. Oczywiście niekoniecznie to już koniec, bo przepisy są takie, że... Ale zdaje się że to chyba już temat poza treścią tego forum snitch.gif

Ten post edytował oldek 19.12.2004, 09:19:11


--------------------
Czy demokracja to złudzenie ? Zanim powiesz 'tak', sprawdź.
Go to the top of the page
+Quote Post
Grizzli
post 21.03.2005, 22:21:20
Post #13





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 1.03.2005

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


Mozna tez w inn sposob zrobic zapytanie do bazy czy np jak u mnie pracodawca złozył jakas oferte

  1. SELECT pracodawcy.idpracodawca, pracodawcy.nazwisko
  2. FROM pracodawcy LEFT JOIN oferty_pracodawcow USING ( idpracodawca )
  3. WHERE oferty_pracodawcow.IDoferta_pracodawcy IS NULL



Bardzo przydatny post przydał mi sie biggrin.gif
Go to the top of the page
+Quote Post
Lonas
post 22.11.2005, 19:55:54
Post #14





Grupa: Zarejestrowani
Postów: 576
Pomógł: 14
Dołączył: 9.11.2005

Ostrzeżenie: (20%)
X----


a jak zrobić takie zapytanie, które wyszuka np według kontrahentów, pokaże wynik - i teraz po naciśnięciu pokaże faktura pozaycje,
zakładamy że produkty faktura_pozycje mają takie same ID jak faktura.


--------------------
Go to the top of the page
+Quote Post
dudus1
post 9.12.2005, 12:12:57
Post #15





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 7.12.2005

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


Zwrócony wynik zapytania powinien tworzyć odnośniki do faktur poszczególnego klienta, a więc trzeba odpowiednio sformatować tabelę wyników, tak aby zwróciła listę kontrahentów, która będzie automatycznie odnośnikami,

Na potrzeby tych skryptów należy przyjąć:
- wszystkie wartości w tabelach jako "id" zostały zamienione zgodnie z nazwą tabeli, np. w tabeli "php_klient" id zmieniono na id_klienta, itd.

Niestety jest to wersja demo, nie testowana.

Tworzymy plik np. "klienci.php" odpowiedzialny za pobranie listy klientów i wyświetlenie odnośników do ich faktur. Listing poniżej.
Cytat
<?php
// pobranie informacji o klientach z bazy danych i przekazanie ich do tablicy
$tablica_klientow = pobierz_klientow();

// wyświetlenie listy klientów, pobranych z tabeli utworzonej wcześniej
wyswietl_klientow($tablica_klientow);

// funkcja pobierająca listę klientów z bazy i zapisująca ich do tablicy 
function pobierz_klientow()

  $lacz = lacz_bd();
  $zapytanie = "select * from php_klient where id_klienta";
  $wynik = @mysql_query($zapytanie);
  if (!$wynik)
    return false;
  $ilosc_klientow = @mysql_num_rows($wynik);
  if ($ilosc_klientow ==0)
      return false;
  $wynik = wynik_bd_do_tablicy($wynik);
  return $wynik;
}

// funkcja przekazująca wynik danego zapytania do tablicy
function wynik_bd_do_tablicy($wynik)
{
  $tablica_wyn = array();

  for ($licznik=0; $rzad = @mysql_fetch_array($wynik); $licznik++)
    $tablica_wyn[$licznik] = $rzad;

  return $tablica_wyn;
}

// funkcja wyświetlająca listę klientów
function wyswietl_klientow($tablica_klientow)
{
  //wyświetlenie listy klientów z przekazanej tablicy
  if (!is_array($tablica_klientow))
  {
    echo '<br />Brak klientów w bazie danych.<br />';
  }
  else
  {
    //stworzenie tabeli
    echo '
    <table width="px" class="" border = 0>';
   
    //stworzenie wiersza tabeli dla każdego zamówienia
    foreach ($tablica_klientow as $rzad)
    {
      // plik faktury.php... odpowiada za wyświetlenie faktur danego klienta
      $url = 'faktury.php?id_klienta='.($rzad['id_klienta']);   
      echo '</td><td width="436" valign="top" align="center">';
      $tytul = 'Numer klienta '.$rzad['id_klienta'].', nazwa '.$rzad['nazwa'];
      tworz_html_url($url, $tytul);
      echo '</td></tr>';
    }
    echo '</table>';
  }
  echo '<hr />';
}

// funkcja tworząca odnośnik dla każdego klienta
function tworz_html_url($url, $nazwa)
{
  // wyświetlenie URL-a jako łącza i nowa linia
?>
  <a href="<?php echo $url; ?>"><?php echo $nazwa; ?></a><br />
<?php
}
?>

Tworzymy plik "faktury.php" odpowiedzialny za wyświetlenie faktur danego klienta. Listing poniżej.
Cytat
<?php
$id_klienta = $_GET['id_klienta'];

// pobranie zamowienia z bazy danych
$faktury = pobierz_liste_faktur($id_klienta); 

// wyświetlenie faktur danego klienta
wyswietl_liste_faktur($faktury);

// funkcja pobierająca listę faktur
function pobierz_liste_faktur($id_klienta)
{
  // zapytanie bazy danych o wszystkie dane konkretnego zamówienia
  if (!$id_klienta || $id_klienta=='')
    return false;

  $lacz = lacz_bd();
  $zapytanie = "select * from php_faktura where id_klienta='$id_klienta'";
  $wynik = @mysql_query($zapytanie);
  if (!$wynik)
    return false;
  $ilosc_faktur = @mysql_num_rows($wynik);
  if ($ilosc_faktur ==0)
      return false;
  $wynik = wynik_bd_do_tablicy($wynik);
  return $wynik; 
}

// funkcja przekazująca wynik danego zapytania do tablicy
function wynik_bd_do_tablicy($wynik)
{
  $tablica_wyn = array();

  for ($licznik=0; $rzad = @mysql_fetch_array($wynik); $licznik++)
    $tablica_wyn[$licznik] = $rzad;

  return $tablica_wyn;
}

// funkcja wyświetlająca
function wyswietl_liste_faktur($faktury)
{
  // wyświetlenie wszystkich danych konkretnego filmu
  if (is_array($faktury))
  {
    echo '<br />Brak faktur wybranego klienta.<br />';
  }
  else
  {
    //stworzenie tabeli
    echo '
    <table width="px" class="" border = 0>';
   
    //stworzenie wiersza tabeli dla każdego zamówienia
    foreach ($faktury as $rzad)
    {
      // plik dane_faktury.php... odpowiada za wyświetlenie zawartości faktur danego klienta
      $url = 'dane_faktury.php?id_faktury='.($rzad['id_faktury']);   
      echo '</td><td width="436" valign="top" align="center">';
      $tytul = 'Numer klienta '.$rzad['id_klienta'].', data wystawienia '.$rzad['data_wystawienia'];
      tworz_html_url($url, $tytul);
      echo '</td></tr>';
    }
    echo '</table>';
  }
  echo '<hr />';
}

// funkcja tworząca odnośnik do każdej faktury
function tworz_html_url($url, $nazwa)
{
  // wyświetlenie URL-a jako łącza i nowa linia
?>
  <a href="<?php echo $url; ?>"><?php echo $nazwa; ?></a><br />
<?php
}
?>

I trzeci plik, "dane_faktury.php". Odpowiedzialny za wyświetlenie zawartości danej faktury konkretnego klienta. Listing poniżej.
Cytat
<?php
$id_klienta = $_GET['id_klienta'];
$id_faktury = $_GET['id_faktury'];

// przekazuje pozycje faktury do tablicy
$tablica_faktur = pobierz_dane_faktury($id_faktury);

// wyświetla pozycje z danej faktury faktury
wyswietl_pozycje_faktury($tablica_faktur);

// funkcja pobierająca pozycje faktury
function pobierz_dane_faktury($id_faktury)
{
  // zapytanie bazy danych o zamówienia
  if (!$id_faktury || $id_faktury=='')
    return false;
 
  $lacz = lacz_bd();
  $zapytanie = "select * from php_towar,php_faktura_pozycje where php_towar.id_towaru=php_faktura_pozycje.id_towaru and php_faktura_pozycje.id_faktury = '$id_faktury'";
  $wynik = @mysql_query($zapytanie);
  if (!$wynik)
    return false;
  $ilosc_pozycji = @mysql_num_rows($wynik);
  if ($ilosc_pozycji ==0)
      return false;
  $wynik = wynik_bd_do_tablicy($wynik);
  return $wynik;
}

// funkcja przekazująca wynik danego zapytania do tablicy
function wynik_bd_do_tablicy($wynik)
{
  $tablica_wyn = array();

  for ($licznik=0; $rzad = @mysql_fetch_array($wynik); $licznik++)
    $tablica_wyn[$licznik] = $rzad;

  return $tablica_wyn;
}

// funkcja wyświetlająca pozycje faktury
function wyswietl_pozycje_faktury($tablica_faktur)
{
  //wyświetlenie wszystkich pozycji z tablicy faktur
  if (!is_array($tablica_faktur))
  {
    echo '<br />Brak pozycji na fakturze.<br />';
  }
  else
  {
    //stworzenie tabeli
    echo '
    <table width="px" class="" border = 0>
    <b>Zamówiono :</b><br />';
   
    //stworzenie wiersza tabeli dla każdego zamówienia
    foreach ($tablica_faktur as $rzad)
    {

      echo '<td width="436" valign="top" style="text-align:justify;"><ul><li><b>
      Nazwa:</b> '.$rzad['nazwa_towaru'].', <b>Ilość:</b> '.$rzad['ilosc'].' <b>Kwota jednostkowa netto:</b> '.$rzad['kwota_jednostkowa_netto'].' <b>Stawka Vat:</b> '.$rzad['stawka_vat'].' <b>Wartość Vat:</b>  '.$rzad['wartosc_vat'].' <b>Wartość netto:</b> '.$rzad['wartosc_netto'].' <b>Kwota brutto</b> '.$rzad['kwota_brutto'].' PLN';

      echo '</td></tr>';
    }
    echo '</ul></ul></table></br />';
  }
  echo '';
}
?>


Mam nadzieję, że to działa, bo jak wspomniałem na początku nie miałem czasu żeby to sprawdzić.
Go to the top of the page
+Quote Post
MalyKazio
post 9.01.2008, 12:18:23
Post #16





Grupa: Zarejestrowani
Postów: 168
Pomógł: 1
Dołączył: 19.11.2005

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


To teraz ja mam pytanie. Jak z takiej bazy, z tabeli "faktura" ([id].[data_wystawienia].[id_klienta]), wyciągnąć id rekordu, gdzie data wystawienia jest taka sama dla dwóch klientów. Czyli np. mamy klienta 1 i 234, jak sprawdzić, czy w jakimś dniu została wystawiona faktura im obu?


--------------------
"Jak Cię widzą tak Cię piszą, chyba żeś jest wielką fiszą"
Go to the top of the page
+Quote Post
bartg
post 25.01.2008, 17:38:27
Post #17





Grupa: Zarejestrowani
Postów: 224
Pomógł: 25
Dołączył: 4.07.2007
Skąd: Berlin

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


  1. SELECT id_klienta, id FROM php_faktura GROUP BY data_wystawienia

O to chodzi?
  1. SELECT COUNT(id_klienta) AS count, id, data_wystawienia FROM php_faktura WHERE id_klienta=1 AND id_klienta=234 GROUP BY data_wystawienia

Tego nie jestem pewien
Poprawcie mnie jeśli jest źle dry.gif

Pisane z palca

Ten post edytował bartg 25.01.2008, 21:33:30


--------------------
Go to the top of the page
+Quote Post
peyn
post 27.01.2008, 13:13:57
Post #18





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 20.09.2004
Skąd: Konin

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


Cytat(bartg @ 25.01.2008, 18:38:27 ) *
  1. SELECT COUNT(id_klienta) AS count, id, data_wystawienia FROM php_faktura WHERE id_klienta=1 AND id_klienta=234 GROUP BY data_wystawienia

Tego nie jestem pewien
Poprawcie mnie jeśli jest źle dry.gif


No tu jest zle. Nie mozesz jednoczesnie dac
  1. id_klienta = 1 AND id_klienta = 234
To jest blad logiczny. Id klienta nie moze byc jednoczesnie rowne 1 i 234. Co najwyzej moze byc rowne 1 LUB 234. Czyli powinno byc
  1. id_klienta = 1 OR id_klienta = 234


Tak czy siak wg mnie to zapytanie nie zadziala. Grupujesz po dacie wystawienia, ale w kolumnach ktore pobeirasz masz kolumny ktore nie sa ani grupowane, ani nie uzywasz na nich zadnych agregujacych funkcji (po za count) wiec wg mnie to zapytanie nie zgrupuje Ci po dacie.

Ja bym to zrobil tak (przy zalozeniu ze szukamy daty w ktorej zostaly wystawione faktury jednoczesnie dla obu klientow):
  1. SELECT COUNT( data_wystawienia ) AS ile, data_wystawienia FROM php_faktura WHERE id_klienta = 1 OR id_klienta = 234 GROUP BY data_wystawienia HAVING ile > 1
Go to the top of the page
+Quote Post
esp
post 22.10.2015, 08:35:12
Post #19





Grupa: Zarejestrowani
Postów: 11
Pomógł: 1
Dołączył: 18.09.2006
Skąd: Skarżysko

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


Znalazłem chyba najbardziej odpowiedni wątek smile.gif

Chcę wyświetlić zamówienia (order_status BETWEEN '6' AND '7') dla których nie wydano wszystkich towarów z magazynu.
tabele:
orders - order_id
orders_inc - order_id, prod_id, ilosc
fk_docs - order_id (jesli pole korekta == 1 muszę odjąć od liczby wydanych)
fk_docs_items - doc_id, prod_id, ilosc

kod PHP który to robi dla jednego zamowienia działa poprawnie dla dla 16k rekordów to jakaś masakra i wydawało mi się, że może zapytaniem będzie lepiej to zwracać
  1. $totalCounts = array();
  2. $list = $fk->getDocs("*", " WHERE typ='3' AND `order_id`='" . $order['order_id'] . "'");
  3. $produkt = new Produkt;
  4. foreach ($list as $key => $pos) {
  5. $items = $fk->getDocItems("*", " WHERE `doc_id` = '" . $pos['id'] . "'");
  6. foreach ($items as $item) {
  7. $in[] = $item['prod_id'];
  8. if (!$pos['korekta'])
  9. $totalCounts[$item['prod_id']] += $item['ilosc'];
  10. else
  11. $totalCounts[$item['prod_id']] -= $item['ilosc'];
  12. }
  13. $in = array_unique($in);
  14. $products = $produkt->getProduct(array(), " AND products.prod_id IN (" . implode(',', $in) . ")");
  15. $list[$key]['items'] = $items;
  16. $list[$key]['items_full'] = $products;
  17. }
  18. $Zamowienie = new Zamowienie();
  19. $Zamowione = $Zamowienie->getZamowioneProdukty($order['order_id'], true);
  20.  
  21. $doWydania = 0;
  22. foreach ($Zamowione as $k => $v) {
  23. $Zamowione[$k]['ilosc'] -= $totalCounts[$v['pid']];
  24. $Zamowione[$k]['magazyn'] = $Zamowione[$k]['mag'];
  25. $doWydania += $Zamowione[$k]['ilosc'];
  26. }


wymyśliłem takie coś, ale źle zwraca wyniki, dla niektórych rekordów np. gdy zamównienie ma 51 szt zapytanie pokazuje mi ponad 2k.
  1. SELECT o.order_id, sum(oi.ordinc_ilosc) AS zam_ilosc, sum(fkd.ilosc) AS liczba
  2. FROM orders o
  3. JOIN orders_inc oi ON o.order_id = oi.order_id
  4. LEFT JOIN fk_docs fk ON fk.order_id = o.order_id
  5. LEFT JOIN fk_docs_items fkd ON fk.id = fkd.doc_id
  6. WHERE o.order_status BETWEEN '6' AND '7'
  7. GROUP BY o.order_id
  8. HAVING liczba IS NULL OR zam_ilosc <> liczba
  9. ORDER BY o.order_id DESC


Ten post edytował esp 22.10.2015, 09:06:18
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: 25.06.2018 - 18:33