2012-01-02 10 views
4

を動作していないではないだから私は、次のカルコゲノフルバレン骨格を持つトランザクションテーブル内のすべてのトランザクションを格納します。mysqlは等しい

+----------------+---------------+------+-----+---------+----------------+ 
| Field   | Type   | Null | Key | Default | Extra   | 
+----------------+---------------+------+-----+---------+----------------+ 
| debit_amount | decimal(10,2) | YES |  | 0.00 |    | 
| credit_amount | decimal(10,2) | YES |  | 0.00 |    | 
| flag   | int(11)  | YES |  | NULL |    | 
| date   | datetime  | YES |  | NULL |    | 
| id    | int(11)  | NO | PRI | NULL | auto_increment | 
+----------------+---------------+------+-----+---------+----------------+ 

それから私は、ユーザーがユーザーテーブルに「クレジット」の行に持ってクレジットの総量を保存します。

私は、取引テーブルに格納されているユーザーごとの合計(借方金額+クレジット数)がユーザーテーブルに保存されているクレジット数に不一致があるかどうかを確認しようとしています。

各ユーザ

transactions.debit_amount + transactions.credit amount MUST EQUAL user.credits 

ための基本的

なく(transactions.totalトランザクションテーブルには行がそのユーザのために存在しない、すなわちヌルである場合は特に)、MySQLのクエリ内の等しい演算子は動作しないしません:

SELECT s.id AS uid, s.total, s.credits 
FROM (
    SELECT (sum(t.credit_amount) + sum(t.debit_amount)) AS total, t.userid, u.credits, u.id 
    FROM transactions AS t 
    RIGHT JOIN users AS u ON t.userid = u.id 
    GROUP BY u.id 
) AS s 
WHERE s.total != s.credits 
+4

ちょっと考えましたが、ここではニックピッキングが可能ですが、トランザクションクエリのデータベースコンテキストでの単語の特別な意味のために 'トランザクション'とは異なる名前を使用しようとします...エラーは発生しませんが人々のために物事を1%難しくするかもしれません... – rdlowrey

+0

[推測] s.total <> s.credits [/ code] – Alfabravo

+0

あなたは '動作しません 'と言っていますが返されるものの例は与えませんそしてそれがあなたが期待しているものとどのように違うのか... – DaveRandom

答えて

4

試してみてください。

select u.id, u.credits, t.total 
from users u 
left join (
    select userid, sum(coalesce(credit_amount,0)) + sum(coalesce(debit_amount, 0)) as total 
    from transactions 
    group by userid 
) t on u.id = t.userid 
where coalesce(t.total, 0) <> coalesce(u.credits, 0) 
+0

+1私は似たような答えを書いていましたが、あなたはより速かったです。 –

0

あなたはを比較することはできません0の値をMySQLでnull以外の値に設定します(少なくとも、そうした場合、結果は常にNULLになります)。

もしあなたがそれを取り除くことができるのであれば、INNER JOINを使って取引をしたユーザーだけを取得してください。そうでない場合は、COALESCEを使用して、取引行がない場合はMichałの回答に従ってデフォルト値の0を指定します。

関連する問題