Check welke rij een kolom heeft die groter is dan 5
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 -
Je kan prima per aangemaakte rij een tijd meegeven, zodat je makkelijker berekeningen kan maken.
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?
Dan kan je met wat simpele queries er ook eenvoudig mee rekenen.
Gewijzigd op 21/03/2020 12:50:04 door - Ariën -
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)
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
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'.
Code (php)
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
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);
?>
// 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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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);
?>
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:
Gewijzigd op 21/03/2020 14:29:58 door Frank Nietbelangrijk
Waarom is tellen in MySQL 'duurder' dan in PHP:
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.
Is dit niet eenvoudiger?
WHERE DATE(datum) = '2020-03-21'
Gewijzigd op 23/03/2020 13:17:32 door Rob Doemaarwat
Ger van Steenderen op 23/03/2020 12:20:22:
@Frank
Waarom is tellen in MySQL 'duurder' dan in PHP:
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.