SQLQuery - 计算单个 Table 中按第 3 个值分组的 2 个值范围内的值

SQLQuery - Counting Values For A Range Across 2 Values Grouped-By 3rd Value in A Single Table

我有一个MySQL数据库结构如下:(左边的数字是行号)

 +------------+----------+--------------+-------------+
 | start_dsgn | end_dsgn | min_cost_1   | min_cost_2  |
 +------------+----------+--------------+-------------+
1|          1 |        2 |            3 |         100 |
2|          1 |        3 |            5 |         153 |
3|          1 |        4 |           10 |         230 |
4|          2 |        1 |            4 |          68 |
5|          2 |        3 |            5 |         134 |
6|          3 |        1 |            7 |          78 |
7|          3 |        2 |            8 |         120 |
+------------+----------+--------------+-------------+

我想查询数据库,以便对于每个开始设计,return 两个成本输入之一小于输入的结束设计的计数。因此,例如用户输入 cost_1 和 cost_2 的值。查询将 return 行数的计数,按设计分组,其中 cost_1 >= min_cost_1 或 cost_2 >= min_cost_2。

所以对于上面的数据库,让我们假设用户输入

cost_1 = 5
cost_2 = 100

这应该 return 类似于:

{1:2, 2:2, 3:1}

其中的结构是:

{start_design_1: count(row 1 + row 2), start_design_2:count(row 4 + row 5) , start_design_3:count(row 6)}

我只是想知道是否有人对如何执行此查询有任何提示或解决方案,因为我对 SQL 还比较陌生。非常感谢。

另请注意,我的数据库未按照示例中的顺序排序,我这样做是为了让示例更容易理解。

您没有指定您使用的 SQL 版本,所以我在 SQL 服务器中执行此示例,其中 @cost_1 是一个变量。您可以根据您正在使用的任何 SQL 变体的语法对其进行调整。以下将为您提供所需的计数作为 SQL 结果集:

SELECT start_dsgn, COUNT(CASE WHEN min_cost_1 <= @cost_1 OR min_cost_2 <= @cost_2 THEN end_dsng END) as Cnt
FROM table
GROUP BY start_dsgn

一旦你有了它,你就可以将它转换成你想要的任何格式,无论你使用哪种语言来查询数据库。您也没有指定您使用的是哪种语言,但看起来您想要一本字典,其中 start_dsgn 是关键。

大多数语言会 return 列表或列表、元组或字典的数组,具体取决于您使用的内容。从那里可以很容易地将它们转换成任何其他形式,至少在 Python 中是这样。像 C#、Java 和 Swift 这样的强类型语言有点棘手。

您需要使用 GROUP BY 来组合 start_dsgn 的每个值的行,因此:

select start_dsgn, count(*)
from Table1
group by start_dsgn

WHERE 子句中添加成本标准。如何将它们放入语句中取决于您使用的语言——您将不得不做一些研究。在 Java 中可能是:

select start_dsgn, count(*)
from Table1
where where min_cost_1 <= ? or min_cost_2 <= ? 
group by start_dsgn

这将 return 它作为一个行集 - 根据您的问题,您可能必须将其转换为 JSON 结构。这不是严格意义上的 SQL 事情,因此您将不得不再次研究。

Fiddle 在这里:http://sqlfiddle.com/#!9/087c5/2

我最终解决了以下查询:

SELECT start_dsgn, count(*) FROM table_name WHERE cost_1 >= min_cost_1 OR cost_2 >= min_cost_2 GROUP BY start_dsgn;