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
    )
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top