SQL noob,请耐心等待我!
我在数据库中存储了一个3元组(x,y,{signal1,signal2,..})。
我有一个包含表坐标(x,y)的数据库和另一个名为signals(signal,coordinate_id,group)的表,它存储各个信号值。在同一坐标上可以有几个信号。
该组只是一个abitrary整数,它将信号表中的条目标记为属于同一组(假设它们属于同一个坐标)。因此,具有相同“coordinate_id”和“group”的任何信号一起形成如上所示的元组。
例如,
Coordinates table Signals table -------------------- ----------------------------- | id | x | y | | id | signal | coordinate_id | group | | 1 | 1 | 2 | | 1 | 45 | 1 | 1 | | 2 | 2 | 5 | | 2 | 95 | 1 | 1 | | 3 | 33 | 1 | 1 | | 4 | 65 | 1 | 2 | | 5 | 57 | 1 | 2 | | 6 | 63 | 2 | 1 |
这会产生元组(1,2 {45,95,33}),(1,2,{65,57}),(2,5,{63})等等。
我想为每个坐标检索{signal1,signal2,...}的集合。属于一组的信号具有相同的coordinate_id和组,但我不一定知道组值。我只知道如果特定coordinate_id的组值相同,那么具有该组的所有人都会形成一组。
我尝试了查看SQL GROUP BY
,但我意识到它是用于聚合函数的。
有人可以指出如何在SQL中正确执行此操作,或提供改进数据库结构的提示。
答案 0 :(得分:2)
SQLite支持类似于MySQL的GROUP_CONCAT()
聚合函数。它在组中汇总一组值并将它们连接在一起以逗号分隔。
SELECT c.x, c.y, GROUP_CONCAT(s.signal) AS signal_list
FROM Signals s
JOIN Coordinates ON s.coordinate_id = c.id
GROUP BY s.coordinate_id, s.group
SQLite还允许select-list中的列与group-by子句中的列不匹配,即使ANSI SQL和大多数实现都不严格允许这样做。
答案 1 :(得分:1)
我个人将数据库写成3个表:
x_y(x, y, id) coords_groups(pos, group, id) signals(group, signal)
with signals.group->coords_groups.id and coords_groups.pos->x_y.id
因为你试图表示一种4维数组。
然后,从几个坐标(X,Y)得到一个信号列表的ArrayList你可以用这个
SELECT temp."group", signals.signal
FROM (
SELECT cg."group", cg.id
FROM x_y JOIN coords_groups AS cg ON x_y.id = cg.pos
WHERE x_y.x=X AND x_y.y=Y )
AS temp JOIN signals ON temp.id=signals."group"
ORDER BY temp."group" ASC
(X Y在最里面)
在这种伪代码中:
getSignalsGroups(X, Y)
ArrayList<List<Signals>> a
List<Signals> temp
query=sqlLiteExecute(THE_SQL_SNIPPET, x, y)
row=query.fetch() //fetch the first row to set the groupCounter
actualGroup=row.group
temp.add(row.signal)
for(row : query) //foreach row add the signal to the list
if(row.group!=actualGroup) //or reset the list if is a new group
a.add(actualGroup, temp)
actualGroup=row.group; temp= new List
temp.add(row.signal)
return a