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
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.
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?
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.
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

SELECT * FROM tabelnaam WHERE datum BETWEEN '2020-03-21 19:00:00' AND '2020-03-21 23:59:59' ORDER BY datum ASC;


[size=xsmall]Toevoeging op 21/03/2020 13:38:24:[/size]

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

[size=xsmall]Toevoeging op 21/03/2020 13:48:48:[/size]

>> 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.
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'.
Ik ga er van uit dat een reserveringstijd altijd afgerond is op een heel kwartier...

<?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);

?>

[size=xsmall]Toevoeging op 21/03/2020 14:38:22:[/size]

Of je haalt alle tijdstippen op in een array als key => value pair:
<?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:

Array
(
    [18:00] => 3
    [20:00] => 1
    [18:15] => 1
)
@Frank
Waarom is tellen in MySQL 'duurder' dan in PHP:

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
@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.
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'
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).

Reageren