我的查询有问题,无法在脑海中找到解决方案,我试过很多方法,但无法达到预期效果。这是我的表结构:
+----------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+---------------+------+-----+---------+----------------+
| accounts_id | int(11) | NO | PRI | NULL | auto_increment |
| portfolio_id | int(11) | NO | | NULL | |
| contest_id | int(11) | NO | | NULL | |
| user_id | int(11) | NO | | NULL | |
| company_id | int(11) | NO | | NULL | |
| buy_price | decimal(10,2) | YES | | NULL | |
| buy_amount | int(11) | YES | | NULL | |
| buy_commision | decimal(10,2) | YES | | NULL | |
| buy_date | date | YES | | NULL | |
| sell_price | decimal(10,2) | YES | | NULL | |
| sell_amount | int(11) | YES | | NULL | |
| sell_commision | decimal(10,2) | YES | | NULL | |
| sell_date | date | YES | | NULL | |
+----------------+---------------+------+-----+---------+----------------+
我想从每个买卖中找到实现的收益,所以我使用了这个查询:
SELECT
a.company_id,
a.buy_price,
a.buy_amount,
a.buy_commision,
a.buy_date,
a.sell_price,
a.sell_amount,
a.sell_commision,
a.sell_date,
(((a.sell_amount*a.sell_price)-(a.sell_amount*a.sell_price)*.5/100)-((b1.buy_price*a.sell_amount)+ (b1.buy_price*a.sell_amount)*.5/100)) as realized
FROM contest_accounts AS a
RIGHT join contest_accounts as b1
on a.portfolio_id = b1.portfolio_id
WHERE a.user_id = 1
AND a.contest_id = 2;
给我这样的结果: http://sqlfiddle.com/#!2/d8e2c/2
但我想要这样的结果:
+------------+-----------+------------+---------------+------------+------------+-------------+----- -----------+------------+-------------+
| company_id | buy_price | buy_amount | buy_commision | buy_date | sell_price | sell_amount | sell_commision | sell_date | realized |
+------------+-----------+------------+---------------+------------+------------+-------------+----- -----------+------------+-------------+
| 1 | 6.80 | 300 | 10.20 | 2014-03-15 | NULL | NULL | NULL | NULL | NULL |
| 1 | NULL | NULL | NULL | NULL | 6.80 | 200 | 6.80 | 2014-03-15 | -13.6000000 |
| 1 | NULL | NULL | NULL | NULL | 6.80 | 100 | 3.40 | 2014-03-15 | -6.8000000 |
| 1 | 6.80 | 100 | 3.40 | 2014-03-15 | NULL | NULL | NULL | NULL | NULL |
| 1 | NULL | NULL | NULL | NULL | 6.50 | 100 | 3.25 | 2014-03-18 | -36.6500000 |
3 | 20.10 | 200 | 20.10 | 2014-03-15 | NULL | NULL | NULL | NULL | NULL |
| 3 | NULL | NULL | NULL | NULL | 19.80 | 100 | 9.90 | 2014-03-16 | -49.9500000 |
主要问题是当前查询返回如此多的null但我想要的结果是购买日期或实现的收益没有那么多null,我知道我搞乱了加入但不知道如何实现我想要的结果。请检查sqlfiddle的样本数据和查询结果。
答案 0 :(得分:2)
将条件buy_date IS NOT NULL
添加到where子句。这将只给你记录buy_date不为空的记录。您也可以为其他记录添加类似的条件。
我认为您可以将RIGHT JOIN
更改为INNER JOIN
。如果RIGHT JOIN
中可能没有b
的匹配记录,则只能使用a
。在这种情况下,a中始终存在记录,因为您已经通过在where子句中使用条件a.user_id = 1
隐式地过滤掉其他情况。
实际上,更改为INNER JOIN
不会改变结果,但可能会加快查询速度并使其更具可读性(根据我的口味)。