web-dev-qa-db-ja.com

MySQL「または」条件

このMySQLクエリを確認してから、私が本当にやりたいことをお見せしましょう...

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'");

それに関する問題は、私がそれが常に電子メールと一致することを望むことです。この場合(たとえば)、日付が$Date_SixDaysAgoと等しい場合、$Emailがemail列と等しくなくても、クエリから選択されます。

つまり、要するに、私は電子メールを常に電子メール列と等しくし、クエリが$Daye_TwoDaysAgoまたは$Date_ThreeDaysAgoなどに等しい日付を取得するが、電子メールに等しくない場合は等しくないようにします引いて。

私のクエリはこのように見えると思いますが、うまくいかないと確信しています。

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

括弧を使用して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')");

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

ブラケットを使用します。

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'
    )
");

ただし、IN演算子も確認してください。したがって、「date IN( '$ date1'、 '$ date2'、...)」と言うことができます

ただし、連続した日が常にある場合は、日付部分について次のことを行わないでください。

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

あなたの質問は、mysqlの 演算子の優先順位 および Alexが示しています 括弧で優先順位を「オーバーライド」する方法についてです。

しかし、副次的に、列dateのタイプが Date の場合、 MySQLの日時関数 を使用して、たとえば、過去7日間の記録.

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

(またはNow()ではなくCurdate())

4
VolkerK

次のように、ANDロジックを括弧で囲みます。

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