Java 在JDBC中使用SQL查询对数据进行分组

Java 在JDBC中使用SQL查询对数据进行分组,java,sql,ms-access,jdbc,Java,Sql,Ms Access,Jdbc,我只想通过NetBeans中的jdbc从数据库中获取数据。我有一个表hotel,其中的属性是cid、usid、probs、address、status和我想通过cid获取记录及其对应的编号组。我正在使用count函数计算特定cid的记录数 我使用的查询是 rs = stat.executeQuery("select cid, count(cid), address,usid from hostel" + " where status <> 'processed' gro

我只想通过NetBeans中的jdbc从数据库中获取数据。我有一个表hotel,其中的属性是cid、usid、probs、address、status和我想通过cid获取记录及其对应的编号组。我正在使用count函数计算特定cid的记录数

我使用的查询是

rs = stat.executeQuery("select cid, count(cid), address,usid from hostel" 
      + " where status <> 'processed' group by cid having count(cid)<=5"); 
我得到的错误是

您试图执行的查询不包括作为聚合函数一部分的指定表达式“address”


好的,您的错误消息非常清楚,您试图输出的地址不是GROUPBY子句的一部分。有些数据库(如MySQL)让您可以随意使用,它们只是从值中选择一个,而其他数据库则不

包含group by子句中的所有字段(反模式):

group by cid, address, usid  
或者使用子查询:

select distinct(h.cid), x.cid_count, h.address, h.usid 
from hostel h,
(
  select hh.cid, count(hh.cid) cid_count
  from hostel hh 
  where hh.status <> 'processed' 
  group by hh.cid 
  having count(hh.cid)<=5
) x
where h.cid = x.cid

当然,还有很多其他的解决方案,每个数据库都有一些专有的SOL实现细节,例如,由于别名等原因,这个子查询可能无法在您的数据库中工作。。。通常,您可以调整查询以获得更好的性能,例如Oracle支持。但这是一个单独的问题。

您的错误消息非常清楚,您试图输出的地址不是GROUPBY子句的一部分。有些数据库(如MySQL)让您可以随意使用,它们只是从值中选择一个,而其他数据库则不

包含group by子句中的所有字段(反模式):

group by cid, address, usid  
或者使用子查询:

select distinct(h.cid), x.cid_count, h.address, h.usid 
from hostel h,
(
  select hh.cid, count(hh.cid) cid_count
  from hostel hh 
  where hh.status <> 'processed' 
  group by hh.cid 
  having count(hh.cid)<=5
) x
where h.cid = x.cid

当然,还有很多其他的解决方案,每个数据库都有一些专有的SOL实现细节,例如,由于别名等原因,这个子查询可能无法在您的数据库中工作。。。通常,您可以调整查询以获得更好的性能,例如Oracle支持。但这是一个单独的问题。

如果您的RDBMS不是MySQL,则选择列表中的字段应该是聚合字段,或者也应该包含在分组列表中


这与JDBC无关,而是大多数SQL实现的规则。

如果您的RDBMS不是MySQL,则选择列表中的字段应该是聚合字段,或者也应该包含在分组列表中


这与JDBC无关,只是大多数SQL实现的规则。

Thanx但现在仍然不起作用,它在FROM子句中显示了错误-java.SQL.SQLException:[Microsoft][ODBC Microsoft Access Driver]语法错误。这正是您应该发布有关问题的完整信息的原因。你没有用数据库标记你的问题。。。stackoverflow社区无法猜测到底发生了什么。无论如何,我不确定Access是否支持from子句中的子查询,但我用SQL Server演示了这项技术,它非常接近engough。如果它对access不起作用,则“按多个字段分组”反模式肯定会起作用。Thanx但现在仍然不起作用。它在FROM子句中显示错误-java.sql.SQLException:[Microsoft][ODBC Microsoft access Driver]语法错误。这正是您应该发布有关问题的完整信息的原因。你没有用数据库标记你的问题。。。stackoverflow社区无法猜测到底发生了什么。无论如何,我不确定Access是否支持from子句中的子查询,但我用SQL Server演示了这项技术,它非常接近engough。如果它不适用于access,则“按多个字段分组”反模式肯定会起作用。