2015-04-23 62 views
0

我有一个MySQL数据库结构如下:(左边的数字是行号)的SQLQuery - 计数值为一系列在2个值进行分组,通过3个值在一个表中

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

我会就像查询数据库一样,对于每个开始设计,返回两个成本输入之一小于输入的最终设计的数量。例如,用户输入cost_1和cost_2的值。该查询将返回按设计分组的行数,其中cost_1> = min_cost_1或cost_2> = min_cost_2。

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

cost_1 = 5 
cost_2 = 100 

这应该返回类似:

{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。非常感谢你。

另请注意,我的数据库未按照示例进行排序,我这样做是为了让示例更易于遵循。

回答

1

您没有指定使用的SQL版本,所以我在SQL Server中执行此示例,其中@ 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是关键。

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

1

你需要使用一个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 

这将返回它作为一个行集 - 从你的问题,你可能必须将其转换成JSON结构。这不是严格意义上的SQL事情,因此您需要再次研究。

小提琴是在这里:http://sqlfiddle.com/#!9/087c5/2

0

我最终解决这是查询:

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