2012-03-14 11 views
0

今日の日付に基づいて行と合計エントリのSUMSを計算するクエリを作成しようとしています。私のデータベースの日付フィールドは03/14/2012 2:03:19フォーマットです。クエリは、日付を無視し、データベース内のすべてのエントリのSUMを返します。ここに私の質問です:MySQLクエリが失敗する

$string = " 
    SELECT SUM(totalcollected) 
    FROM accounting 
    WHERE agent = '$agentid' 
    AND DATE(date) = DATE(NOW()) 
    AND amount1type = 'Cash' 
    OR amount2type = 'Cash' 
"; 

何か提案がありますか?

+0

"*行のSUMSを計算する*" ... ??? – Lion

+0

クエリを構成するために、補間された文字列ではなくプレースホルダを使用することを検討してください。これとは別に、 'CURRENT_DATE'は' DATE(NOW()) 'と同じことを言いますが、もう少し直接的です。 – pilcrow

+0

where where句( 'DATE(date)')の関数を使用すると、パフォーマンスが低下します。 –

答えて

1

問題がANDあるORを解決しますが、このクールなトリックを完全にORを避けることができます。

SELECT SUM(totalcollected) 
FROM accounting 
WHERE agent = '$agentid' 
AND DATE(date) = DATE(NOW()) 
AND 'Cash' IN (amount1type, amount2type) 
+0

+1 'IN(col1、col2)'の良いアイデア!私はそれが前に行われたことを見ていません –

+0

@Bohemian DATE(NOW())クエリを実行するときに、現在の日付エントリの日付フォーマットが重要ですか?あなたのクエリはまだ私のtotalcollected行を計算していないと私はそれが日付と関係があると感じています。 – savagenoob

+0

このトリックでは、 '(amount1type、amount2type)'に複合インデックスが必要です。そうでなければ、それはパフォーマンスのキラーです。 –

2

私の推測では、最終的な条件、or amount2type = 'cash'は、他のすべての条件が偽であることを許可されています...あなたはwhere句でいくつかの括弧が欠けていること

です。あなたはamount1typeに対するチェックをグループ化するためにこれを変更する必要があります。

SELECT SUM(amount1), SUM(amount2), SUM(monpay), SUM(totalcollected) 
FROM accounting 
WHERE 
    agent = '$agentid' 
    AND DATE(date) = DATE(NOW()) 
    AND (amount1type = 'Cash' OR amount2type = 'Cash') 
0

あなたは、あなたが実際に何をしようとしてデータベースに示すために括弧を必要としています。より良いフォーマットは

​​
3

対それより明確に

SELECT SUM(totalcollected) 
FROM accounting 
WHERE agent = '$agentid' 
    AND DATE(date) = DATE(NOW()) 
    AND amount1type = 'Cash' 
    OR amount2type = 'Cash' 

を行いますMySQL Operator Precedence chartを見てください。 ;

SELECT SUM(totalcollected) 
FROM accounting 
WHERE 
(
    agent = '$agentid' AND 
    DATE(DATE) = DATE(NOW()) AND 
    amount1type = 'Cash' 
) 
OR 
(
    amount2type = 'Cash' 
) 

(I)エージェント= $エージェントの日付を考慮することに注意してください(ⅱ)amount1type =現金:あなたはANDはので、あなたのクエリのようなものになりORに比べて高い優先度を持っていることに気づくでしょうamount2type = cashのローは、日付に関係なく常に返されます。あなたは句が処理されるべき場所を正確にどのようにMySQLを伝えるために括弧を追加する必要があります

SELECT SUM(totalcollected) 
FROM accounting 
WHERE 
agent = '$agentid' AND 
DATE(DATE) = DATE(NOW()) AND 
(
    amount1type = 'Cash' OR amount2type = 'Cash' 
) 
関連する問題