Ich bin mir nicht sicher, ob ich etwas wirklich offensichtlich fehlen, aber ich bekomme immer einen Syntaxfehler bei dieser Abfrage. Selbst wenn ich etwas Offensichtliches verpasse, würde ich gerne wissen, ob es eine klügere Art gibt, das zu bekommen, wonach ich suche.MySQL bedingte Abfrage innerhalb WHERE-Klausel
Grundsätzlich fragt die Abfrage nach Zeilen, die mit einem Benutzer mit einem Startdatum zwischen Montag und Freitag verbunden sind. Das funktioniert großartig. Aber dann habe ich eine bedingte Abfrage hinzugefügt, falls irgendwelche Zeilen für diesen Samstag oder Sonntag vorhanden sind. Beachten Sie, dass die bedingte Abfrage mit einem Samstag oder Sonntag für alle Benutzer überprüft, nicht den Benutzer in der Hauptabfrage:
SELECT user_id,
DATE_FORMAT(DATE(shift_start),'%m/%d/%Y') date,
TIME_FORMAT(TIME(shift_start), '%h:%i %p') start,
TIME_FORMAT(TIME(shift_end), '%h:%i %p') end,
title
FROM shifts
WHERE user_id = '$user_id'
AND DATE(shift_start) BETWEEN
DATE_SUB(DATE(NOW()), INTERVAL WEEKDAY(NOW()) DAY) AND
DATE_ADD(DATE(NOW()), INTERVAL
(SELECT
IF(
COUNT(*) FROM shifts
WHERE DATE(shift_start) BETWEEN
DATE_ADD(DATE(NOW()), INTERVAL 5 - WEEKDAY(NOW()) DAY) AND
DATE_ADD(DATE(NOW()), INTERVAL 6 - WEEKDAY(NOW()) DAY),
6, 4)) - WEEKDAY(NOW()) DAY)
ORDER BY shift_start
Ich bin eigentlich ziemlich stolz darauf, wie es funktioniert, bevor es mit dem IF-Teil vermasselt, aber wieder, wenn es einen offensichtlich besseren Weg gibt, dies zu tun, bin ich ganz Ohr.
Oh, und wenn dies ausgebügelt wird, wird "Now()" durch eine Datumsvariable ersetzt, die im php-Skript eingerichtet ist (über GET übergeben).
Ehrfürchtige Arbeit, benlumey. Hier ist, was funktioniert:
SELECT user_id,
DATE_FORMAT(DATE(shift_start),'%m/%d/%Y') AS shift_start_date,
TIME_FORMAT(TIME(shift_start), '%h:%i %p') AS shift_start_time,
TIME_FORMAT(TIME(shift_end), '%h:%i %p') AS shift_end_time,
title
FROM shifts
WHERE user_id = '$user_id' AND
DATE(shift_start) BETWEEN
DATE_SUB(DATE(NOW()), INTERVAL WEEKDAY(NOW()) DAY)
AND
DATE_ADD
(
DATE(NOW()), INTERVAL
(
SELECT IF(COUNT(*),6,4)
FROM shifts
WHERE DATE(shift_start) BETWEEN
DATE_ADD(DATE(NOW()), INTERVAL 5 - WEEKDAY(NOW()) DAY)
AND
DATE_ADD(DATE(NOW()), INTERVAL 6 - WEEKDAY(NOW()) DAY)
) - WEEKDAY(NOW()) DAY
)
Nachdem ich die Abfrage ein paar Mal durchgelesen habe, muss ich zugeben, dass Sie vielleicht ein wenig unnötige Datumsmathematik machen, die MySQL für Sie tun kann, obwohl es vielleicht mein Unverständnis ist. Könnten Sie vielleicht "DATE (shift_start) ZWISCHEN DATE_SUB (DATUM (JETZT()), INTERVALL WOCHENTAG (JETZT()) TAG) UND ..." bis "WOCHENTAG (shift_start) ZWISCHEN 1 UND ..." vereinfachen? – ruquay
Wenn ich nur WEEKDAY (shift_start) zwischen 0 und 4 benutze, werden nicht ALLE Schichten zurückgegeben, die zwischen ANY Montag und Freitag fallen (was fast alle sind)? Vielleicht verpasse ich etwas in deinem Rat. Ich schätze das Feedback jedoch. Es ist ziemlich haarig und scheint etwas zu sein, was MySQL ohne meine lange Version machen kann. – Anthony