sql >> Databasteknik >  >> RDS >> Mysql

Hur lagrar jag en lista över veckodagar i MySQL?

För att lösa det här problemet slutar jag med att använda en bitmask för att lagra veckodagarna.

Jag ändrade innehållet i veckodagars array till något i stil med detta:

$days = [
     8, // Wednesday
    16, // Thursday
    64, // Saturday
];

Använder denna lista som referens:

 1 : Sunday
 2 : Monday
 4 : Tuesday
 8 : Wednesday
16 : Thursday
32 : Friday
64 : Saturday

Sedan lade jag till en TINYINT kolumn för att hålla veckodagarnas bitmask. När jag lagrar värdena i databasen kan jag helt enkelt använda följande:

$valueToMySQL = array_sum($days); // 88, with the sample above

För att söka efter rader med en specifik veckodag, till exempel lördag, kan jag använda detta villkor:

... WHERE `weekdays` & 64;

Hämta veckodagarna från databasen som en array är lite mindre enkelt. Jag använder följande logik:

$days = [];
$bitmask = strrev(decbin($valueFromMySQL));
for ($i = 0, $s = strlen($bitmask); $i < $s; $i++) {
    if ($bitmask{$i}) {
        $days[] = pow(2, $i);
    }
}

Om jag behöver hämta alla rader med samma veckodag som det aktuella datumet, kan jag överföra den aktuella veckodagen till föregående SQL-villkor enligt följande:

$weekday = (int) date('w'); // 0 for Sunday, to 6 for Saturday
$weekdayToMySQL = pow(2, $weekday); // 1 - 64

Sedan:

... WHERE `weekdays` & {$weekdayToMySQL};


  1. MySQL SELECT-frågesträngsmatchning

  2. XAMPP Körs väldigt långsamt med PHP/MySQL

  3. Flera MySQL Table JOINS måste sammanfoga resultaten av en tabell i ett enda kolumnfält

  4. Kolumn Beroende på annan kolumn