web-dev-qa-db-fra.com

Condition "ou" MySQL

Consultez cette MySQL requête, puis je vous montrerai ce que je veux vraiment qu'elle fasse ...

mysql_query("
SELECT * FROM Drinks WHERE
    email='$Email'
    AND date='$Date_Today'
    OR date='$Date_Yesterday'
    OR date='$Date_TwoDaysAgo'
    OR date='$Date_ThreeDaysAgo'
    OR date='$Date_FourDaysAgo'
    OR date='$Date_FiveDaysAgo'
    OR date='$Date_SixDaysAgo'
    OR date='$Date_SevenDaysAgo'");

Le problème, c'est que je veux qu'il corresponde toujours à l'e-mail. Dans ce cas (par exemple) si la date est égale à $Date_SixDaysAgo alors il sera sélectionné dans la requête même si $Email n'est pas égal à la colonne e-mail.

Donc, en bref, je veux que l'e-mail soit toujours égal à la colonne e-mail, et si la requête tire une date égale à $Daye_TwoDaysAgo ou $Date_ThreeDaysAgo etc .. mais n'est pas égal à l'email alors ne le tirez pas.

Je suppose que ma requête ressemblerait un peu à ça, mais je suis sûr que cela ne fonctionnera pas ..

mysql_query("
    SELECT * FROM Drinks WHERE
    email='$Email'
    AND date='$Date_Today
    || $Date_Yesterday
    || $Date_TwoDaysAgo
    || $Date_ThreeDaysAgo
    || $Date_FourDaysAgo
    || $Date_FiveDaysAgo
    || $Date_SixDaysAgo
    || $Date_SevenDaysAgo'");
25
Joe

Utilisez des crochets pour regrouper les instructions OR.

mysql_query("SELECT * FROM Drinks WHERE email='$Email' AND (date='$Date_Today' OR date='$Date_Yesterday' OR date='$Date_TwoDaysAgo' OR date='$Date_ThreeDaysAgo' OR date='$Date_FourDaysAgo' OR date='$Date_FiveDaysAgo' OR date='$Date_SixDaysAgo' OR date='$Date_SevenDaysAgo')");

Vous pouvez également utiliser IN

mysql_query("SELECT * FROM Drinks WHERE email='$Email' AND date IN ('$Date_Today','$Date_Yesterday','$Date_TwoDaysAgo','$Date_ThreeDaysAgo','$Date_FourDaysAgo','$Date_FiveDaysAgo','$Date_SixDaysAgo','$Date_SevenDaysAgo')");
60
Maxim Krizhanovsky

Utilisez des crochets:

mysql_query("SELECT * FROM Drinks WHERE email='$Email' AND 
    (date='$Date_Today' 
     OR date='$Date_Yesterday' 
     OR date='$Date_TwoDaysAgo' 
     OR date='$Date_ThreeDaysAgo' 
     OR date='$Date_FourDaysAgo' 
     OR date='$Date_FiveDaysAgo' 
     OR date='$Date_SixDaysAgo' 
     OR date='$Date_SevenDaysAgo'
    )
");

Mais vous devriez également jeter un œil à l'opérateur IN. Vous pouvez donc dire "date IN ('$ date1', '$ date2', ...)`

Mais si vous avez toujours un ensemble de jours consécutifs, pourquoi ne pas faire ce qui suit pour la partie date

date <= $Date_Today AND date >= $Date_SevenDaysAgo
10
Alex

Votre question concerne les priorités de l'opérateur dans mysql et Alex vous a montré comment "remplacer" la priorité avec des parenthèses.

Mais à côté, si votre colonne date est du type Date vous pouvez utiliser les fonctions de date et d'heure de MySQL pour récupérer le enregistrements des sept derniers jours, comme par exemple.

SELECT
  *
FROM
  Drinks
WHERE
  email='$Email'
  AND date >= Now()-Interval 7 day

(ou peut-être Curdate () au lieu de Now ())

4
VolkerK

Mettez votre logique AND entre parenthèses, comme ceci:

mysql_query("SELECT * FROM Drinks WHERE email='$Email' AND (date='$Date_Today' OR date='$Date_Yesterday' OR date='$Date_TwoDaysAgo' OR date='$Date_ThreeDaysAgo' OR date='$Date_FourDaysAgo' OR date='$Date_FiveDaysAgo' OR date='$Date_SixDaysAgo' OR date='$Date_SevenDaysAgo')");
0
Ayman Safadi