Mysql Right Join返回不必要的结果

时间:2014-03-18 17:01:49

标签: php mysql sql

我的查询有问题,无法在脑海中找到解决方案,我试过很多方法,但无法达到预期效果。这是我的表结构:

+----------------+---------------+------+-----+---------+----------------+
| 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的样本数据和查询结果。

1 个答案:

答案 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不会改变结果,但可能会加快查询速度并使其更具可读性(根据我的口味)。