mysql复杂的选择查询

时间:2017-07-20 14:59:13

标签: mysql mysqli

我们可以说表格是测试

+--------+------+------+--------+----------+---------------------+---------------------+
| vft_id | v_id | f_id | amount | discount | date_added          | date_updated        |
+--------+------+------+--------+----------+---------------------+---------------------+
|      1 |    3 |    1 |   1500 |      225 | 2017-07-31 11:11:31 | 2017-07-31 11:11:31 |
|      2 |    3 |    2 |     10 |        0 | 2017-07-31 11:11:31 | 2017-07-31 11:11:31 |
|      3 |    4 |    1 |   1000 |        0 | 2017-07-31 11:11:31 | 2017-07-31 11:11:31 |
|      4 |    4 |    2 |    320 |       15 | 2017-07-31 11:11:31 | 2017-07-31 11:11:31 |
|      5 |    5 |    2 |   1000 |        0 | 2017-07-31 11:12:04 | 2017-07-31 11:12:04 |
|      6 |    5 |    1 |   1000 |        0 | 2017-07-31 11:12:04 | 2017-07-31 11:12:04 |
|      7 |    6 |    2 |   1000 |        0 | 2017-07-31 11:12:04 | 2017-07-31 11:12:04 |
|      8 |    6 |    2 |   1000 |        0 | 2017-07-31 11:12:04 | 2017-07-31 11:12:04 |
+--------+------+------+--------+----------+---------------------+---------------------+

选择查询方案:

1。)如果 v_id 包含 f_id = 1 ,请选择所有 v_id 所以会有三行

+------+
| v_id |
+------+
|    3 |
|    4 |
|    5 |
+------+

2。)现在计算在单个查询或子查询中动态添加所有 v_id(金额 - 折扣),其中 f_id = 1 。 在这种情况下,v_id 3,4和5的f_id = 1。 现在结果是,

+------+--------+
| v_id | amount |
+------+--------+
|    3 |   1295 | //1500+10-225-0
|    4 |   1305 | //1000+320-0-15
|    5 |   1000 | //1000+1000-0-0
+------+--------+

这是我正在使用的查询。

SELECT v_id, (amount-discount) as amount FROM Testing WHERE f_id=1

在检查f_id

的同时,我无法弄清楚如何选择v_id

1 个答案:

答案 0 :(得分:1)

通过连接到仅包含F_ID为1的V_ID的子查询,我们确保外部查询仅包含V_ID,其中至少有1条记录的F_ID为1。

通过使用汇总,我们可以总和(金额)并减去每个V_ID

的折扣总和
SELECT T.V_ID, Sum(T.Amount)-Sum(T.Discount) As Amount
FROM Testing T
INNER JOIN (SELECT V_ID FROM Testing WHERE F_ID = 1) T2
 on T2.V_ID = T.V_ID
GROUP BY T.V_ID

我一直在努力解决为什么需要F_ID = 1,但后来认识到你不希望结果中有V_ID 6。

使用where存在将消除我们需要求和的记录,因此连接似乎是合适的。