2012-01-21 21 views
0

私はこのmysqlクエリを2日間実行しています。これはシナリオです。3つのmysqlテーブルからのデータ選択エラー

ユーザーとアカウントの2つのテーブルがあります。下記そこの構造:

私は万の上に起因する人の電話番号を選択したいと有料または14日以上前の最後の課金:私は何をしたいか

$sql="create table if not exists users (
    id bigint(20) not null auto_increment, 
    username varchar(255) not null, 
    password varchar(255) not null, 
    email varchar(255), 
    phone varchar(40), 
    PRIMARY KEY (id, username))"; 

$sql="create table if not exists accounts (
    id int not null auto_increment, primary key(id), 
    userid int(11) not null, 
    type varchar(20) not null, <----- we have two types: bill and pay ------> 
    amount varchar(255) not null, 
    date_paid datetime not null)"; 

。私たちが起因している人を見つけるにはどうすればよい

:人が行うと

insert into accounts (id, userid, type, amount, date_paid) values ('', 'id of the person', 'OWE', 50000, '$date'); 

:あなたは(000、50を仮定して)請求された場合

を行はこのようなDBに追加されます有料(20、000を想定)、行も挿入されている:

insert into accounts (id, userid, type, amount, date_paid) values ('', 'id of the person', 'PAY', 20000, '$date'); 

人が起因である量を取得する。

全ての紙幣 - 私が思い付いたすべての支払い

:私は長い間、このクエリを修正してきたと私が得る最高のエラーです

select phone from users u, accounts a1, accounts a2 where u.id=a1.userid and phone != '' and (((select sum(a1.amount) from a1 where a1.userid=u.id and a1.type='owe') - (select sum(a2.amount) from a2 where a2.userid=u.id and a2.type='pay')) >= 10000) and datediff(NOW(), select max (a1.datetime) as datetime from a1 where a1.userid=u.id) > 14 group by u.id 

。その一部は次のとおりです。

SQL構文に誤りがあります。テーブルdb.a2は存在しません:select max (a1.datetime) as datetime from a1 where a1.userid=u.id) > 14 group by

私は最後の句を削除すると、それは示し近くで使用する権利構文についてはMySQLサーバのバージョンに対応するマニュアルを確認してください。

どうすればよいですか?

答えて

1

ヒント:

  • 量が10進数または何か
  • ストア負の金額でのお支払いになり、あなたは単にバランス
に取得する金額を超える合計することができたときにそれが良いだろう

残高を得る

SELECT u.id, SUM(CASE WHEN type = 'OWE' 
       THEN CAST(amount AS DECIMAL(10,2)) 
       ELSE CAST(amount AS DECIMAL(10,2))*-1 END) as balance 
FROM users u 
INNER JOIN accounts a ON u.id = a.userid 
GROUP BY u.id 
HAVING balance > 10000 

彼の電話番号は、少なくとも5文字

WHERE CHAR_LENGTH(phone) > 4 

すべて一緒に+日

SELECT u.phone, u.id, SUM(CASE WHEN type = 'OWE' 
       THEN CAST(amount AS DECIMAL(10,2)) 
       ELSE CAST(amount AS DECIMAL(10,2))*-1 END) as balance, 
      MAX (date_paid) as last_action 
FROM users u 
INNER JOIN accounts a ON u.id = a.userid 
WHERE CHAR_LENGTH(phone) > 4 
GROUP BY u.id 
HAVING balance > 10000 OR DATE_SUB(CURDATE(),INTERVAL 14 DAY) <= last_action 
+0

はありがとうございました!!!できたね。ちょうど少数の演算子を変更しました。もう一度ありがとう –

関連する問題