MySQL requête conditionnelle à l'intérieur où l'article
-
13-09-2019 - |
Question
Je ne sais pas si je me manque quelque chose de vraiment évident, mais je continue à obtenir une erreur de syntaxe sur cette requête. Même si je manque quelque chose d'évident, je voudrais savoir s'il y a une façon plus intelligente de faire ce que je suis après.
Au fond, la requête demande toutes les lignes liées à un utilisateur avec un start_date du lundi au vendredi. Cela fonctionne très bien. Mais j'ai ajouté une requête conditionnelle dans le cas où il y a des lignes pour ce samedi ou le dimanche. Notez que la requête conditionnelle vérifie pour tous les utilisateurs avec un samedi ou un dimanche, pas l'utilisateur dans la requête principale:
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
Je suis en fait assez fier de la façon dont cela fonctionne avant qu'elle ne salit avec la partie IF, mais encore une fois, s'il y a une façon évidemment mieux faire cela, je suis tout ouïe.
Oh, et quand cela s'aplanies, le "Now ()" sera remplacée par une variable de date fixée dans le script php (qui lui est passé par GET).
travail impressionnant, benlumey. Voici ce qui a fonctionné:
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
)
La solution
Essayer cette sous-requête:
(SELECT
IF(COUNT(*) > 0, 6, 4)) - WEEKDAY(NOW()) DAY)
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)
Deux choses que j'ai fait
- fait ressembler à une requête normale, la et où ne peut pas aller à l'intérieur du si pour autant que je sache.
- Mettez une condition dans le cas, ne pense pas que MySQL prendra automatiquement 0 comme faux et> 0 comme vrai.
Autres conseils
se désagrège ici:
(SELECT
IF(
COUNT(*) FROM shifts
WHERE DATE(shift_start) BETWEEN
La déclaration de comptage ne fonctionnera pas.
Qu'est-ce que vous essayez de faire? Vous avez besoin d'une déclaration claire de ce que vous essayez d'accomplir ici.
Ceci est mon butin à lui:
(SELECT
IF(
(select 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))>0,6,4)
) - WEEKDAY(NOW()) DAY
Mais sans savoir ce que vous essayez de faire, je ne suis pas sûr.