[PHP/MySQL] Selecteren reeks records*

Pagina: 1
Acties:

Onderwerpen


  • robinm
  • Registratie: Oktober 2003
  • Laatst online: 30-07 07:10
Voor een site wil ik dat er een gemiddelde wordt gemaakt van een bepaalde reeks.
Mensen moeten kunnen kiezen uit reeksen die gegeven worden door de pagina.
De pagina moet een reeks geven wanneer er 3 records zijn met oplopende datum.

Ik kan me alleen geen functie bedenken waar mee dat kan en zou ook niet weten hoe ik deze moet maken. Ik heb geprobeerd te zoeken maar kan niets vinden wat lijkt op wat ik wil.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Zoiets?
SQL:
1
2
3
4
5
SELECT *
FROM tabel
WHERE id >= id_van_eerste_record
ORDER BY datumveld
LIMIT 3

Of begrijp ik je verkeerd?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • robinm
  • Registratie: Oktober 2003
  • Laatst online: 30-07 07:10
Als je het zo doet neemt de de laatste 3 records. Het gaat er om dat die het alleen mag geven als er drie zijn na elkaar de elkaar opvolgen
Dus:
2005-09-10
2005-09-11
2005-09-12
moet die weergeven maar
2005-09-09
2005-09-11
2005-09-12
dus niet

  • Swinnio
  • Registratie: Maart 2001
  • Laatst online: 16-09 07:50
kun je dan niet het beste de datum van drie dagen terug berekenen en alle records met een datum na die berekende datum laten selecteren?

If the world wouldn't suck, we'd all fall off


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 19:51

Creepy

Tactical Espionage Splatterer

Maar je kan toch simpel checken in PHP of de drie datums die je eruit krijgt opeenvolgend zijn?
En anders doe je een select met 3 keer een datum in je where
code:
1
WHERE datum='2005-09-10' or datum='2005-09-11' or datum='2005-09-12'

of een between met 09-10 en 09-12,
en check of je result 3 rows teruggeeft of niet.
Dus ik snap niet echt dat je niks kan bedenken dat deze reeks teruggeeft tenzij je echt iets heel anders bedoelt.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Maxxi
  • Registratie: Mei 2004
  • Laatst online: 19-04 19:18
hmm ik zat verschillende manieren te bedenken maar idd dit valt niet mee.
Sowieso kan dit nie talleen in SQL, je zult een while $datum (< = >) iets moeten gebruiken.

PHP heeft een mkdate/mktime? functie, je kan proberen om een loop te maken die elke keer dat ie draait de datum 1 dag later maakt.

Maar hoe percies durf ik niet te zeggen.
// deze werkt denk ik niet zo goed:P
while ($i < 30; $i++);{

$datum = '10-09'-$i;

select * from tabel where datum = $datum

}

Iemand HIER nog een uitbreiding/verbetering aan?
while ($i < 30; $i+=3; $b = $i-3 );{

WHERE datum= BETWEEN '2005-09-$b' '2005-09-$i'

if (mysql_numrow = 3) {
print groepje van 3 }

}

[ Voor 65% gewijzigd door Maxxi op 29-09-2005 23:58 ]


  • robinm
  • Registratie: Oktober 2003
  • Laatst online: 30-07 07:10
Creepy schreef op donderdag 29 september 2005 @ 23:48:
Maar je kan toch simpel checken in PHP of de drie datums die je eruit krijgt opeenvolgend zijn?
En anders doe je een select met 3 keer een datum in je where
code:
1
WHERE datum='2005-09-10' or datum='2005-09-11' or datum='2005-09-12'

of een between met 09-10 en 09-12,
en check of je result 3 rows teruggeeft of niet.
Dus ik snap niet echt dat je niks kan bedenken dat deze reeks teruggeeft tenzij je echt iets heel anders bedoelt.
Het probleem is dus dat er geen vaste datums zijn. Hij moet kijken of er een reeks is en zoja welke

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Pseudocode:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$query = mysql_query("
    SELECT *
    FROM `tabel`
    ORDER BY `datumveld`
  ");

$seq = 0;
$lastdate = 0;
$dates = array();
while ($row = mysql_fetch_assoc($query)) {
  if (datumverschil == 1dag || $seq == 0 || $lastdate == 0) {
    $seq++;
    $lastdate = $row['datumveld'];
  } else {
    $seq = 0;
  }
  if ($seq == 3) {
    $dates[] = $lastdate - 2dagen;
    $dates[] = $lastdate - 1dag;
    $dates[] = $lastdate;
  }
  $seq = 0;
}

Lijkt me niet zo'n probleem dus? Op het einde heb je in elk geval een array met alle datumreeksen van 3.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Maxxi
  • Registratie: Mei 2004
  • Laatst online: 19-04 19:18
hmm daar kan ik nog niet tegen op:P mooi gedaan!

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
SQL:
1
2
3
4
5
SELECT a.datum, b.datum, c.datum
FROM
tabel a 
  JOIN tabel b ON b.datum = DATE_ADD(a.datum, INTERVAL 1 DAY)
  JOIN tabel c ON c.datum = DATE_ADD(b.datum, INTERVAL 1 DAY)


Het als drie records onder elkaar krijgen is wat lastiger gok ik zo :)
Maar wellicht dat je hier wat mee kan, als het goed is geeft dat alle koppeltjes van drie dagen, maar het is verder ongetest dus als je foutmeldingen krijgt moet je sowieso de syntax nog even nalopen en als je foute resultaten krijgt, laat dan even zien wat je terugkrijgt.

Owja, hiermee krijg je uiteraard 2 records terug als je zou hebben:
09-09, 10-09, 11-09, 12-09
en een veelvoud bij meer records, ik hoop dat dat geen nadeel is ;)
Als dat wel een probleem is, dan wordt de query aardig wat complexer en dat kan je wellicht handiger in je applicatie eruit filteren.

[ Voor 22% gewijzigd door ACM op 30-09-2005 07:53 ]


Acties:
  • 0 Henk 'm!

  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 20:05
Zoals hierboven al geopperd: het meest logisch is met een loop door je records heen lopen.

Was advocaat maar vindt het juridische nog steeds leuk


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Nee, het meest logisch is met JOINs op zichzelf, zoals ACM toont.

Acties:
  • 0 Henk 'm!

  • Swinnio
  • Registratie: Maart 2001
  • Laatst online: 16-09 07:50
Weet niet hoe groot je database is, maar filteren op datums is, zeker wanneer het bijbehorende veld niet geindexeerd is, een redelijk dure operatie. Is misschien iets om je in achterhoofd te houden...

If the world wouldn't suck, we'd all fall off


Acties:
  • 0 Henk 'm!

  • Gwaihir
  • Registratie: December 2002
  • Niet online
Toch denk ik dat de database server het een stuk sneller uitzoekt dan php via dat puzzelen met een forse array.

Acties:
  • 0 Henk 'm!

  • Swinnio
  • Registratie: Maart 2001
  • Laatst online: 16-09 07:50
Nee, dat klopt. In PHP is een nog slechtere oplossing. Ik bedoelde alleen maar dat het wellicht via de SQL kant efficienter kan.

If the world wouldn't suck, we'd all fall off

Pagina: 1