计算MySQL中两行金额之差
我有一个计算计算MySQL中两行金额之差,mysql,Mysql,我有一个计算余额的表,表中有以下列: > describe tbl_credit_log +------------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------------+------------------+--
余额的表,表中有以下列:
> describe tbl_credit_log
+------------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| visitor_id | int(10) unsigned | YES | MUL | NULL | |
| post_owner_id | int(10) unsigned | YES | MUL | NULL | |
| post_id | int(10) unsigned | YES | MUL | NULL | |
| balance | double(50,6) | YES | | NULL | |
| credits | double(50,6) | YES | | NULL | |
| debits | double(50,6) | YES | | NULL | |
| trans_id | varchar(255) | NO | | NULL | |
| trans_amount | double(50,6) | YES | | NULL | |
| earningtype | varchar(15) | NO | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
+------------------+------------------+------+-----+---------+----------------+
这里是我想进行计算的几个条目:
+---------+------------+---------------+---------+------------------+-------------+-----------+--------+---------------------+
| id | visitor_id | post_owner_id | post_id | advertisement_id | balance | credits | debits | created_at |
+---------+------------+---------------+---------+------------------+-------------+-----------+--------+---------------------+
| 4331666 | 11006 | 11 | NULL | NULL | 3639.624400 | 22.500000 | NULL | 2018-08-10 05:45:37 |
| 4364034 | 7206 | 11 | NULL | NULL | 5139.607900 | 22.500000 | NULL | 2018-08-10 11:02:52 |
| 4377238 | 4353 | 11 | NULL | NULL | 5162.107900 | 22.500000 | NULL | 2018-08-10 12:52:01 |
| 4485288 | 9664 | 11 | NULL | NULL | 5184.607900 | 22.500000 | NULL | 2018-08-11 08:58:19 |
| 4544185 | 11709 | 11 | NULL | NULL | 5207.107900 | 22.500000 | NULL | 2018-08-11 19:06:52 |
| 4550728 | 11970 | 11 | NULL | NULL | 5229.607900 | 22.500000 | NULL | 2018-08-11 20:39:36 |
| 4607317 | 12021 | 11 | NULL | NULL | 5252.107900 | 22.500000 | NULL | 2018-08-12 07:29:17 |
| 4629660 | 11926 | 11 | NULL | NULL | 5274.607900 | 22.500000 | NULL | 2018-08-12 09:18:56 |
| 4725299 | 12088 | 11 | NULL | NULL | 5297.107900 | 22.500000 | NULL | 2018-08-13 01:54:53 |
| 4725347 | 10253 | 11 | NULL | NULL | 5319.607900 | 22.500000 | NULL | 2018-08-13 08:29:46 |
| 4725357 | 12140 | 11 | NULL | NULL | 5342.107900 | 22.500000 | NULL | 2018-08-13 09:27:44 |
+---------+------------+---------------+---------+------------------+-------------+-----------+--------+---------------------+
这里我们在id号上有差异(超过50),我想在整个数据库中找到,其中用户id将作为外键发布所有者id
我想获得所有在金额上有差异的post\u所有者id
,以及在
创建的
所以预期的结果是这样的
+---------+------------+---------------+---------+------------------+-------------+-----------+--------+---------------------+
| id | visitor_id | post_owner_id | post_id | advertisement_id | balance | credits | debits | created_at |
+---------+------------+---------------+---------+------------------+-------------+-----------+--------+---------------------+
| 4364034 | 7206 | 11 | NULL | NULL | 5139.607900 | 22.500000 | NULL | 2018-08-10 11:02:52 |
+---------+------------+---------------+---------+------------------+-------------+-----------+--------+---------------------+
这里我们将有多个post\u owner\u id
。我正在显示一个post\u owner\u id
,因为这个结果只包含一个post owner id。但是我想得到不同的post owner id,它们之间的差额大于50。
我不知道该怎么做。我想比较group\u by
post\u owner\u id上的价格,并获得差异金额所在的行。考虑以下因素:
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,balance DECIMAL(12,6) NOT NULL
,created_at timestamp NOT NULL
);
INSERT INTO my_table VALUES
(4331666,3639.624400,'2018-08-10 05:45:37'),
(4364034,5139.607900,'2018-08-10 11:02:52'),
(4377238,5162.107900,'2018-08-10 12:52:01'),
(4485288,5184.607900,'2018-08-11 08:58:19'),
(4544185,5207.107900,'2018-08-11 19:06:52'),
(4550728,5229.607900,'2018-08-11 20:39:36'),
(4607317,5252.107900,'2018-08-12 07:29:17'),
(4629660,5274.607900,'2018-08-12 09:18:56'),
(4725299,5297.107900,'2018-08-13 01:54:53'),
(4725347,5319.607900,'2018-08-13 08:29:46'),
(4725357,5342.107900,'2018-08-13 09:27:44');
备选案文1:
SELECT a.*
FROM
( SELECT x.*
, MIN(y.id) y_id
FROM my_table x
JOIN my_table y
ON y.created_at > x.created_at
GROUP
BY x.id
) a
JOIN my_table b
ON b.id = a.y_id
AND b.balance > a.balance + 50;
+---------+-------------+---------------------+---------+
| id | balance | created_at | y_id |
+---------+-------------+---------------------+---------+
| 4331666 | 3639.624400 | 2018-08-10 05:45:37 | 4364034 |
+---------+-------------+---------------------+---------+
备选案文2:
SELECT id
, balance
, created_at
FROM
( SELECT x.*
, @i<balance-50 i
, @i:=balance
FROM my_table x
, (SELECT @i:=null) vars
ORDER
BY created_at
) n
WHERE i = 1;
+---------+-------------+---------------------+
| id | balance | created_at |
+---------+-------------+---------------------+
| 4364034 | 5139.607900 | 2018-08-10 11:02:52 |
+---------+-------------+---------------------+
选择id
,结余
,于
从…起
(选择x*
,@i'amount'?什么是'amount'?无论如何,答案是11,因为这是唯一的post_owner\u idno amount=余额
@Strawberry所以,你在寻找连续余额之间的差值大于50的行?是的@Strawberry你说得对。我想我的解释比你的解释要简单一点!谢谢@我尝试了这个查询。但是似乎没有地方可以放置我试图放入选项2中的post\u owner\u id
。但是它产生了该用户的所有值。在选项1中,您只需将其添加到子查询和加入条件中。在选项2中,您必须将其添加到order by子句中,并调整@I