我有一张这样的桌子。
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。
引入时,我需要将其作为线条的形状点块。 (即)第1 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循环?
请帮我。
提前致谢!
最佳答案
我只是在这里提问,但是您的选择在很多方面都有缺陷。
select Distinct LineId where AreaId = id
首先,您在哪里
FROM
表声明。第二:您是否要根据先前检索的ID来获取LineId的唯一列表?
如果是这样,则参数化的select应该如下所示:
select Distinct LineId from table_2 where AreaId = ?
但是,您真正应该查找的是如何在select语句中使用联接。
更新资料
您的代码不再有意义。
首先,您获得唯一的AreaIds。 -> 1
然后您获得唯一的LineIds-> 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"