我有一张这样的桌子。
AreaId LineId ShapePointno x y
1 0 0 2 3
1 0 1 2 5
1 0 2 3 8
1 1 0 2 6
1 1 1 3 2
在此之前,我会解释这些问题。
属于AreaId1
1的线Id 0具有3个形状点,编号为0,1和2.其x和y对应于其坐标位置。
有了这样的背景,让我把问题放在手中。
我需要获取这些记录并将其带到 java 。
引入时,我需要将它作为一条线的形状点块。 (即)前3行作为一个块,接下来2个在不同的块中。这背后的原因是我需要修改x& y值和修改函数需要以下参数。
i)AreaID, LineId, A 2D array of its shape points).
这是我尝试过的。
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost/task4DB?"
+ "user=root&password=123");
PreparedStatement st = con.prepareStatement("select Distinct AreaId from TableName")
ResultSet r1=st.executeQuery();
while (r1.next())
{
int id = r1.getInt("AreaId");
PreparedStatement st1 = con.prepareStatement("select Distinct LineId where AreaId = id")
ResultSet r2=st1.executeQuery();
while (r2.next())
{
int lineid = r2.getInt("LineId");
PreparedStatement st2 = con.prepareStatement("select x,y where AreaId = id and LineId = lineid")
ResultSet r3=st2.executeQuery();
int size = 0;
int [][]xy = new int[r3.getCount()][r3.getCount()]
while (r3.next())
{
xy[size][0] = r3.getInt("x");
xy[size][1] = r3.getInt("y");
size++;
}
callShapePointConv(id,lineId,xy);
}
}
我没有得到预期的结果而是显示垃圾值/
请帮帮我。
此外,还有其他更好的替代可用而不是三个while循环吗?
请帮助我。 提前谢谢!
答案 0 :(得分:1)
我找到了 - 在第14行,您正在执行st1.executeQuery()但它应该是st2.execute查询
我评论了你的专栏,并添加了正确的专栏。
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost/task4DB?"
+ "user=root&password=123");
PreparedStatement st = con.prepareStatement("select Distinct AreaId from TableName")
ResultSet r1=st.executeQuery();
while (r1.next())
{
int id = r1.getInt("AreaId");
PreparedStatement st1 = con.prepareStatement("select Distinct LineId where AreaId = id")
ResultSet r2=st1.executeQuery();
while (r2.next())
{
int lineid = r2.getInt("LineId");
PreparedStatement st2 = con.prepareStatement("select x,y where AreaId = id and LineId = lineid")
//ResultSet r3=st1.executeQuery();
ResultSet r3 = st2.executeQuery();
int size = 0;
int [][]xy = new int[r3.getCount()][r3.getCount()]
while (r3.next())
{
xy[size][0] = r3.getInt("x");
xy[size][1] = r3.getInt("y");
size++;
}
callShapePointConv(id,lineId,xy);
}
}
答案 1 :(得分:1)
除了Java代码之外,您还可以通过以下方式降低数据库设计的复杂性,
<强> TABLE_1:强>
AreaLineId(FK) ShapePointno x y
0 0 2 3
0 1 2 5
0 2 3 8
1 0 2 6
1 1 3 2
表_2:
AreaLineId AreaId LineId
0 1 0
1 1 1
现在查询将是,
select x,y from table_1 where AreaLineId = id;
和另一个从table_2获取id的选择wapper查询将以较低的复杂度完成工作。
答案 2 :(得分:1)
我只是在这里讨论,但你的选择在很多方面存在缺陷。
select Distinct LineId where AreaId = id
首先,你在哪里FROM
表声明。
第二:你想根据以前检索到的id获取LineId的不同列表吗?
如果是这样,您的参数化选择应如下所示:
select Distinct LineId from table_2 where AreaId = ?
但你应该查看的是如何在select语句中使用连接。
<强>更新强>
您的代码不再有意义。
首先,您将获得唯一的AreaIds。 - &GT; 1
然后你会获得独特的LineIds - &gt; 0,1
然后从表中选择所有元素,其中
(1) while: AreaId = 1
and L
(2) while:
(loop 1) lineId = 0
(loop 2) lineId = 1
这将最终返回表格内容:)
也许,这可以帮到你:
这将基于areaId和lineId将x和y分组为值列表。
SELECT
AreaId,
LineId,
GROUP_CONCAT(table.x),
GROUP_CONCAT(table.y)
FROM
`table`
GROUP BY
AreaId,
LineId
ORDER BY
table.ShapePointno
结果:
AreaId LineId GROUP_CONCAT(table.x) GROUP_CONCAT(table.y)
1 0 "2,2,3" "3,5,8"
1 1 "2,3" "6,2"