简体   繁体   English

MySQL复杂的选择查询

[英]mysql complicated select query

lets just say table is Testing : 可以说表正在测试中

+--------+------+------+--------+----------+---------------------+---------------------+
| 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 |
+--------+------+------+--------+----------+---------------------+---------------------+

Select query scenario : 选择查询方案:

1.) select all v_id if v_id contains f_id=1 so there would be three rows 1.)如果v_id包含f_id = 1 ,则选择所有v_id ,因此会有三行

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

2.) now calculate add all v_id (amount - discount) which also has f_id=1 dynamically in single query or sub query. 2.)现在计算添加所有v_id(金额-折扣) ,在单个查询或子查询中动态添加f_id = 1 In this case v_id 3,4 and 5 has f_id=1. 在这种情况下,v_id 3,4和5具有f_id = 1。 Now the result would be, 现在的结果是,

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

This is the query which I am using. 这是我正在使用的查询。

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

I can't figure it out how to select v_id while also checking f_id 我不知道如何选择v_id并同时检查f_id

By joining to a subquery which contains only V_ID which have a F_ID of 1, we ensure the outer query only contains V_IDs for which at least 1 record had a F_ID of 1. 通过加入仅包含F_ID为1的V_ID的子查询,我们确保外部查询仅包含至少1条记录的F_ID为1的V_ID。

By using aggregation we can sum(amount) and subtract sum of discounts for each V_ID 通过使用聚合,我们可以求和(金额)并减去每个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

I was struggling with why F_ID = 1 was needed but then recognized you didn't want V_ID 6 in the results. 我在为为什么需要F_ID = 1而苦苦挣扎,但后来意识到您不希望V_ID 6出现在结果中。

Using a where exists would eliminate records we needed to sum, thus a join seemed appropriate. 使用where存在将消除我们需要求和的记录,因此联接似乎是合适的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM