我有两个表:locations
和events
每个位置可以有多个事件。我已成功完成一个查询来获取所有位置和匹配事件,但是,这些事件将作为合并的数据集与所有location
数据一起返回。我需要以某种方式将每个事件和所有事件列为子行,以便以后可以正确处理它们。
此查询:
"select locations.*,events.* FROM locations,events WHERE locations.lid = events.lid AND locations.lid=1001"
正在返回合并数据,例如:
data [array 1]
0: lid: "1001" // location info
name: "Johns Bar"
address1: "123 Main St"
...
...
eventID: "1000" // event info
eName: "Halloween Bash"
eDate: "2018-10-31"
...
...
是否有可能获取特定的locations.lid
和所有匹配的events.lid
并将events
记录列为location
数据的子集。
返回的内容如下:
data [array 1]
0: lid: "1001"
name: "Johns Bar"
address1: "123 Main St"
...
...
Events: [array 5]
0: lid: "1001"
eventID: "1000"
eName: "Halloween Bash"
eDate: "2018-10-31"
...
...
1: lid: "1001"
eventID: "1010"
eName: "Christmas Party"
eDate: "2018-12-17"
...
...
2: [lid: "1001",...]
3: [lid: "1001",...]
4: [lid: "1001",...]
答案 0 :(得分:0)
那么所有匹配的事件将始终作为单个返回行的一部分返回吗?没有办法让辅助记录作为子行/记录列出吗?
是的,这就是JOIN的工作方式。
如果没有,那么这将迫使我执行两个查询...还是有另一种方法?
否,您不必运行多个查询。
您可以在SQL返回结果集时获取结果集,其中包含匹配的location
和event
行的配对。确保在SQL查询中按location
进行排序。
然后,当您获取结果行时,请在客户端应用程序的变量中跟踪“当前”位置。如果您获取一行并且其位置与之前看到的位置相同,则将其忽略。
伪代码:
sql = SELECT ... FROM location JOIN event ... ORDER BY location
execute sql
location = nil
while row = fetch():
if row[location] != location:
print location
end if
location = row[location] # for next time
print event
end while
这是处理SQL结果集的常用模式。