我需要一个sql查询来根据基于类别字段的某些条件从表中选择一些项目。 作为一个例子,考虑人员列表,我从数据库中获取特定年龄组的人员。我想检查结果是否包含来自多个类别中的每一个的至少一个结果。如果不是,我想通过扩展它来修改年龄组并再次检查结果。重复这一过程,直到我得到一个年龄组,每个类别都有一个结果。现在我通过分析结果和修改sql查询来做到这一点。因此发送了许多sql select查询。这样做最有效的方法是什么? 我正在使用jdbc从java程序调用select查询。我正在使用mysql数据库。
答案 0 :(得分:1)
您需要创建如下所示的程序或功能,可以轻松解决您的问题
create procedure GetPeople
@condition varchar(max)
as
begin
declare @affectRec int
SET @ParmDefinition = N'@cound nvarchar(max), @cout int output';
declare @@query nvarchar(max)
set @query= 'select * from people where @cond; set @cout=@@rowcount'
exec @query
EXECUTE sp_executesql
@query
,@ParmDefinition
,@cond = @condition
,@count = @affectRec output
;
if @affectRec > 0
begin
return;
end
else
begin
//update condition code
exec GetPeople(condition)
end
end
答案 1 :(得分:1)
您可以在单个查询中执行此操作,方法是不对您不知道范围的类别应用过滤。关键是按照理想值或理想范围的“距离”进行排序。
例如,如果您知道A类和A类的固定值(a和b)。 B,但想要找到C类的值,更喜欢最接近'idealC'的值,那么你可以做
SELECT
A, B, C,... FROM YorData
WHERE
CategoryA=a AND CategoryB=b
ORDER BY abs(C-<idealC>)
如果您只想要一个匹配的行,则在查询中添加“LIMIT 1”。
您可以将其扩展为在范围上工作,要将类别C的值范围视为“理想”,还要查找不在此范围内的行,请将order by子句更改为
ORDER BY LEAST(C-maxC, minC-C)
(其中minC / maxC定义了您最感兴趣的值范围。)
这将首先在范围内产生行,然后是范围之外的行。和以前一样,你可以使用LIMIT 1来获取一行。