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

时间:2018-11-20 16:09:22

标签: mysql select subquery left-join

我有两个表:locationsevents

每个位置可以有多个事件。我已成功完成一个查询来获取所有位置和匹配事件,但是,这些事件将作为合并的数据集与所有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",...]

1 个答案:

答案 0 :(得分:0)

  

那么所有匹配的事件将始终作为单个返回行的一部分返回吗?没有办法让辅助记录作为子行/记录列出吗?

是的,这就是JOIN的工作方式。

  

如果没有,那么这将迫使我执行两个查询...还是有另一种方法?

否,您不必运行多个查询。

您可以在SQL返回结果集时获取结果集,其中包含匹配的locationevent行的配对。确保在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结果集的常用模式。