Check welke rij een kolom heeft die groter is dan 5

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mike Hendriks

Mike Hendriks

21/03/2020 12:01:34
Quote Anchor link
Hallo,

Ik heb de volgende database-structuur staan (ik denk dat het niet de meest logische structuur is, maar ik kon niks anders bedenken):

Klik

Het is bedoeld om reserveringen via de website in kaart te brengen. Elke keer dat er een reservering geplaatst wordt komt er +1 bij de desbetreffende datum (rij) en tijdstip (kolom).

Nu zou ik de datum + tijdstip willen terugkrijgen van alle tijdstippen die HOGER dan 5 zijn. Dus wanneer op 25 maart voor 19:30, 6 reserveringen zijn geplaatst, wil ik graag dat weten.

Wat is de juiste/beste manier om dit te doen?

Alvast bedankt,
Mike
Gewijzigd op 21/03/2020 12:13:23 door - Ariën -
 
PHP hulp

PHP hulp

31/03/2020 20:40:53
 
- Ariën -
Beheerder

- Ariën -

21/03/2020 12:14:31
Quote Anchor link
Nee, het is niet echt een logische structuur. Je moet juist in de lengte werken, en niet in de breedtte.
Je kan prima per aangemaakte rij een tijd meegeven, zodat je makkelijker berekeningen kan maken.
 
Mike Hendriks

Mike Hendriks

21/03/2020 12:32:06
Quote Anchor link
Goedendag Ariën,

Bedankt voor je reactie. Heb jij misschien een idee hoe ik dit beter aan kan pakken? Het `laatste_bestelnummer` moet wel achter de datum staan, die loopt op per bestelling.

Is het misschien beter om nog een tabel aan te maken, voor alleen de tijdstippen?
 
- Ariën -
Beheerder

- Ariën -

21/03/2020 12:49:43
Quote Anchor link
Je kan per bestelling toch in een apart veld de volledige tijd noteren als DATETIME type?

Dan kan je met wat simpele queries er ook eenvoudig mee rekenen.
Gewijzigd op 21/03/2020 12:50:04 door - Ariën -
 
Frank Nietbelangrijk

Frank Nietbelangrijk

21/03/2020 13:33:17
Quote Anchor link
Inderdaad zoals Ariën aangeeft gewoon één rij (of record) per reservering pakken.

Wat ik nog niet helemaal zeker kan zeggen is die kolom laatste_bestelnummer... kun je daar iets meer over vertellen. Want die reserveringen om het kwartier per dag vallen die dan allemaal onder één bestelnummer?

Indien je een bestelnummer zou kunnen hanteren per reservering dan zou je de kolommen

-id
-(laatste_)bestelnr
-datum (DATETIME)

krijgen.

Vervolgens kun je met een query gewoon alle reserveringen tussen twee bepaalde tijden kunnen ophalen. bijv
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT * FROM tabelnaam WHERE datum BETWEEN '2020-03-21 19:00:00' AND '2020-03-21 23:59:59' ORDER BY datum ASC;


Toevoeging op 21/03/2020 13:38:24:

Maar misschien dient die laatste_bestelnummer wel heel ergens anders voor en moet je misschien wel een extra tabel aanmaken.

Toevoeging op 21/03/2020 13:48:48:

>> Dus wanneer op 25 maart voor 19:30, 6 reserveringen zijn geplaatst, wil ik graag dat weten.

Dat kun je ook oplossen in PHP of Mysql. Maar queries zijn relatief "dure" operaties dus ik zou er al gauw voor kiezen om in één query alle reserveringen op te halen van een bepaalde dag en de rest binnen PHP op te lossen.
Gewijzigd op 21/03/2020 13:51:11 door Frank Nietbelangrijk
 
Mike Hendriks

Mike Hendriks

21/03/2020 13:53:17
Quote Anchor link
Bedankt voor je reactie Frank.

Elke bestellingen krijgt een bestelnummer toegewezen. Dit bestelnummer is per dag afhankelijk. Dit getal begint per dag op 500.

- Dus de eerste bestelling voor 25 maart krijgt bestelnummer 501, 2e bestelling krijgt 502 etc.
- De eerste bestelling van 28 maart krijgt ook bestelnummer 501, 2e bestelling 502 etc.

Dit getal loopt deze per datum vanaf 500 omhoog.

Ik heb dus een datumpicker met ook alle tijdstippen (van 16.00 - 20:00). Als er voor 18:00 bijvoorbeeld al meer dan 5 bestellingen zijn gedaan, wil ik graag het tijdstip 18:00 disablen in de datumpicker.

Ik wil dus de datum + tijdstip terugkrijgen waarbij het tijdstip vaker dan 5 keer is 'besteld'.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

21/03/2020 14:29:03
Quote Anchor link
Ik ga er van uit dat een reserveringstijd altijd afgerond is op een heel kwartier...

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php

// een functie die het aantal overeenkomende datetimes telt
function getAantalReserveringen(DateTime $datetime, array $data) :int
{
    $aantal = 0;
    
    foreach($data as $row) {
        $reservationTime = new DateTime($row['datum']);
        if($datetime == $reservationTime)
            $aantal++;
    }

    
    return $aantal;
}


// haal de reserveringen van een bepaalde datum uit de database
$query = "SELECT * FROM tabelnaam WHERE datum BETWEEN '2020-03-21 00:00:00' AND '2020-03-21 23:59:59';";

$result = mysqli_query($conn, $query);
if($result === false) {
   exit(mysqli_error($conn));
}


$data = mysqli_fetch_all($result, MYSQLI_ASSOC);

// bepaal van welk tijdstip je het aantal reserveringen wilt tellen
$datetime = new DateTime('2020-03-21 18:00:00');

// roep de functie aan om het aantal reserveringen te verkrijgen
echo getAantalReserveringen($datetime, $data);

?>


Toevoeging op 21/03/2020 14:38:22:

Of je haalt alle tijdstippen op in een array als key => value pair:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php

function getAantalReserveringen($data)
{

    $result = [];
    
    foreach($data as $row) {
        $reservationTime = new DateTime($row['datum']);
        $time = $reservationTime->format('H:i');
        if(isset($result[$time])) {
            $result[$time]++;
        }
else {
            $result[$time] = 1;
        }
    }

    
    return $result;
}


$result = getAantalReserveringen($data);
print_r($result);
?>


Uitkomst van bovenstaande:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
Array
(
    [18:00] => 3
    [20:00] => 1
    [18:15] => 1
)
Gewijzigd op 21/03/2020 14:29:58 door Frank Nietbelangrijk
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

23/03/2020 12:20:22
Quote Anchor link
@Frank
Waarom is tellen in MySQL 'duurder' dan in PHP:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT datum, COUNT(*) aantal FROM reserveringen
WHERE datum BETWEEN '2020-03-21 00:00:00' AND '2020-03-21 23:59:59'
GROUP BY datum HAVING aantal = 6
 
Ivo P

Ivo P

23/03/2020 12:52:40
Quote Anchor link
@Ger
Dat staat er niet.
Er staat dat query's duur zijn. En dat je dus beter alle benodigde tellingen in 1 keer op kunt vragen ipv per tijdslot een (tel)query te draaien.
 
- SanThe -

- SanThe -

23/03/2020 13:09:44
Quote Anchor link
WHERE datum BETWEEN '2020-03-21 00:00:00' AND '2020-03-21 23:59:59'

Is dit niet eenvoudiger?
WHERE DATE(datum) = '2020-03-21'
 
Rob Doemaarwat

Rob Doemaarwat

23/03/2020 13:17:11
Quote Anchor link
BETWEEN kan gebruik maken van een evt. index op de datum kolom. Op het moment dat je met een function (DATE()) gaat werken gaat die index verloren (= trager).
Gewijzigd op 23/03/2020 13:17:32 door Rob Doemaarwat
 
Frank Nietbelangrijk

Frank Nietbelangrijk

23/03/2020 13:43:52
Quote Anchor link
Ger van Steenderen op 23/03/2020 12:20:22:
@Frank
Waarom is tellen in MySQL 'duurder' dan in PHP:


Hoi Ger,

Ik schreef dat een query een vrij dure operatie is. Niet dat tellen in MySql duurder is ;-). Als je de gegevens die je nodig hebt met met één aggregate query kunt ophalen dan is dat natuurlijk prima.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.