mysql选择主记录和多个次记录作为排序数据集

tcomlyy6  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(188)

我有两张table: 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",...]
5kgi1eie

5kgi1eie1#

所以所有匹配的事件总是作为一个返回行的一部分返回?是否无法将辅助记录列为子行/记录?
是的,连接就是这样工作的。
如果没有,那么这将迫使我做两个查询…或者有其他方法吗?
不,您不必运行多个查询。
当sql返回结果集时,您可以获取结果集,并使用匹配的对 location 以及 event 排。一定要分类 location 在sql查询中。
然后在获取结果行时,跟踪客户端应用程序中变量的“当前”位置。如果您获取一行,并且它的位置与您以前看到的位置相同,则忽略它。
伪代码:

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结果集的常见模式。

相关问题