Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Za bardzo skomplikowane jak dla mnie zapyt
Forum PHP.pl > Forum > Bazy danych > MySQL
djluzak
Wyzwanie dla ambitych:

Tabela:
[list]id osob data
1 20 10.06 11.06 12.06 13.06
2 15 09.06 10.06 11.06 12.06
3 30 08.06 09.06 10.06 11.06 12.06 13.06 14.06
4 50 12.06 13.06 14.06 15.06 16.06 17.06
[list]

A więc tak zakladamy ze sa 3 komorki tabeli: id, osob i data. Pole "osob" to sa liczby osob bedach w danych dniach. W pozycji 1 jest 20 osob ktore sa (np zapisane na jakis kurs) w nastepujacych dniach: 10.06, 11.06, 12.06 i 13.06
Chcialbym wykonac nastepujace zapytanie:
- wybrac z tabeli takie wiersze ktore spelniaja taka zaleznosc:
W dniu 11.06 suma osob wynosi 20+15+30=65
Chhce wybrac tylko te dni ( z pola "data" -varchar) w ktorych liczba osob przekracza zakladajmy 50. Daty sa oddzielone spacja.
Nie mam pojecia jak sie do tego zabrac. Mysle nad jakas petla, ale od tego myslenia umysl mi sie przegrzewa. A tabel i ich postaci zmienic nie moge:(
Wynik zwracalby ta date, w ktorej przekroczona jest ilosc osob.
Moze ma ktos jakas propozycje...dziekuje za pomoc...
MaKARON
to se ne da.... ta tabela jest błędna, musisz inaczej przechowywać te informacje, wtedy będziesz mógł wyciągać takie dane. W tej postaci jest to (w prosty sposóB) niemożliwe...
shima
Daty, jak mniemam, znasz. Skrypt prosty nie będzie.
Założenia: znasz terminy (vide: tablica_terminow), zrobiłem to na plikach, ale zakładam, ze na bazę przerobić umiesz. Dajesz wtedy [sql:1:9676800ea2]LIKE '%termin%'[/sql:1:9676800ea2] Jest jeszcze prościej, ale nie chce mi się tworzyć bazy żeby napisać ten skrypt.Jeżeli mimo to będziesz miał problem to daj znać, a napiszę które zmienne podmienić odpowiednimi zapytaniami sql-a . Wypisuje jak chciałeś
[php:1:9676800ea2]<?php
$tablica_terminow =
array('08.06'=>0,'09.06'=>0,'10.06'=>0,'11.06'=>0,'12.06'=>0,'13.06'=>0,
'14.06'=>0,'15.06'=>0,'16.06'=>0,'17.06'=>0);
foreach ($tablica_terminow as $k=>$v)
{
echo $k."=>".$v."n";
}
$i=0; //pomocnicza zmienna licznikowa
$wiersz = file('terminy.txt');
foreach ($wiersz as $cont)
{
$i++;
$a[$i] = explode(" ", $cont);
for ($nr = 2; $nr < count($a[$i]); $nr++)
{
$ter = $a[$i][$nr];
$tablica_terminow[$ter] = $tablica_terminow[$ter] + $a[$i][1];
}
}
echo "A teraz tylko większe od 50n";
foreach ($tablica_terminow as $k=>$v)
{
if ($v>50) echo $k."=>".$v."n";
}

?>[/php:1:9676800ea2]
kepke
Luzak chyba nie napisal ze to jest latwe. Tak na moj gust jest troche problemow z tym. Na pewno istnieje jakas metoda wykonania tego... jak by dobrze przerobic ten skrypt na plikach to by cos bylo...
kepke
Nie porabales cos z tym skryptem? Bo nic nie zwraca.....
shima
Przetestowany na tym:

Kod
1 20 10.06 11.06 12.06 13.06

2 15 09.06 10.06 11.06 12.06

3 30 08.06 09.06 10.06 11.06 12.06 13.06 14.06

4 50 12.06 13.06 14.06 15.06 16.06 17.06

Zwraca:

Kod
08.06=>0

09.06=>0

10.06=>0

11.06=>0

12.06=>0

13.06=>0

14.06=>0

15.06=>0

16.06=>0

17.06=>0

A teraz tylko większe od 50

10.06=>65

11.06=>65

12.06=>100

13.06=>80


Wytnij pierwszą strukturę foreach i zwróci tylko większe
djluzak
No ten skrypcik dziala ladnie. teraz musze go troszku przerobic. Czyli mam utworzyc tablice z datami. A jesli te daty sa z calego roku to troszku duza ta tablica bedzie.... sad.gif zapytania sobie skonstruuje...jak czegos nie bede wiedzial to sie zapytam..dzieki wielkie...
shima
Cytat
No ten skrypcik dziala ladnie. teraz musze go troszku przerobic. Czyli mam utworzyc tablice z datami. A jesli te daty sa z calego roku to troszku duza ta tablica bedzie.... sad.gif zapytania sobie skonstruuje...jak czegos nie bede wiedzial to sie zapytam..dzieki wielkie...


piece of cake, jak mawiają jankesi. Kod tworzący 366 elementową tablicę dat:




[php:1:fea60e882e]<?php
$rok = 2004; //do sprawdzania poprawności daty
$i=1;
for ($dzien = 1; $dzien <=31; $dzien++)
{
for ($mies = 1; $mies<=12; $mies++))
{
if( checkdate( $mies, $dzien, $rok) //sprawdzenie, czy data ma sens
{
$terminy[$i] = $dzien.'.'.$mies;
$i++;
}
}
}
//i sprawdzenie czy dziala
foreach ($terminy as $k=>$v)
{
echo $k.'=>'.$v.'<br>';
}

?>[/php:1:fea60e882e]

Jeżeli chcesz dwucyfrowe, to sprawdzaj długość zmiennej i ew. dodawaj zero. No i możesz oczywiście zamienć kolejność pętli po $dzien i $mies, nawet lepiej zamień, będzie bardziej czytelnie
djluzak
Cytat
Jeżeli chcesz dwucyfrowe, to sprawdzaj długość zmiennej i ew. dodawaj zero. No i możesz oczywiście zamienć kolejność pętli po $dzien i $mies, nawet lepiej zamień, będzie bardziej czytelnie


[php:1:a1174d1550]<?php

$rok = 2004; //do sprawdzania poprawności daty
$i=1;
for ($mies = 1; $mies <=12; $mies++)
{
for ($dzien = 1; $dzien<=31; $dzien++)
{
if( checkdate($mies, $dzien, $rok)) //sprawdzenie, czy data ma sens
{
$dzien = sprintf("%02d",$dzien);
$mies = sprintf("%02d",$mies);
$terminy[$i] = $dzien.'.'.$mies;
$i++;
}
}
}
//i sprawdzenie czy dziala
foreach ($terminy as $k=>$v)
{
echo $k.'=>'.$v.'<br>';
}



?>[/php:1:a1174d1550]

Jeśli zrobie to w ten sposób to będzie poprawnie wyświetlać wszystkie dni roku. Wcześniej mnie nie bylo wiec nie mialem jak sie tym zajc. Musze jeszcze pomyslec jak przerobic to teraz na zapytania MySQL
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.