2016-01-09 3 views
0

Есть две таблицы, пополнение и покупка.выберите две таблицы mysql без соединения

select * from recharge; 
+-----+------+--------+---------------------+ 
| idx | user | amount | created    | 
+-----+------+--------+---------------------+ 
| 1 | 3 |  10 | 2016-01-09 20:16:18 | 
| 2 | 3 |  5 | 2016-01-09 20:16:45 | 
+-----+------+--------+---------------------+ 
select * from purchase; 
+-----+------+----------+---------------------+ 
| idx | user | resource | created    | 
+-----+------+----------+---------------------+ 
| 1 | 3 |  2 | 2016-01-09 20:55:30 | 
| 2 | 3 |  1 | 2016-01-09 20:55:30 | 
+-----+------+----------+---------------------+ 

Я хочу, чтобы выяснить, баланс пользователей, который SUM (сумма) - COUNT (purchase.idx). (В данном случае 13)

Так что я попытался

SELECT (SUM(`amount`)-COUNT(purchase.idx)) AS balance 
FROM `recharge`, `purchase` 
WHERE purchase.user = 3 AND recharge.user = 3 

, но он возвратил ошибку.

+0

Где ошибка? – Sadikhasan

+0

Хотя ваш код плохо написан и вернет неправильный результат, он не должен приводить к ошибке. Просьба пояснить ошибку. –

ответ

1

Если вы хотите получить точный счет, то агрегат до делать арифметические операции. Для вашего конкретного случая:

select ((select sum(r.amount) from recharge where r.user = 3) - 
     (select count(*) from purchase p where p.user = 3) 
     ) 

Чтобы сделать это для нескольких пользователей, переместите подзапросы в предложении from или использовать union all и агрегации. Второй является более безопасным, если пользователь может быть только в одной таблице:

select user, coalesce(sum(suma), 0) - coalesce(sum(countp), 0) 
from ((select user, sum(amount) as suma, null as countp 
     from recharge 
     group by user 
    ) union all 
     (select user, null, count(*) 
     from purchase 
     group by user 
    ) 
    ) rp 
group by user 
+0

Я исправил опечатки [demo] (http://sqlfiddle.com/#!9/89483/7/0) – lad2025

+0

@ lad2025. , , Спасибо. –

1

можно с помощью союза как этот

SELECT SUM(`amount`-aidx) AS balance 
FROM( 
SELECT SUM(`amount`) as amount, 0 as aidx 
from `recharge` where recharge.user = 3 
union 
select 0 as amount, COUNT(purchase.idx) as aidx 
from `purchase` 
WHERE purchase.user = 3)a 
+0

Вы забыли окончательную сумму [demo] (http://sqlfiddle.com/#!9/89483/3/0). В противном случае вы получите две строки '15' и' -2' – lad2025

Смежные вопросы