2

我正在用 sqlite 构建一个用于火车时刻表的 android 应用程序。我的应用程序请求来自用户 2 个火车站,往返时间和日期(我现在忽略日期)。对于那些我一直在尝试进行单个查询以返回给定日期这些站点之间的所有可用时间表。

我的表结构是:

stations (_id INTEGER PRIMARY KEY AUTOINCREMENT, 
          name TEXT, 
          central BOOLEAN)

schedule_stations (_id INTEGER PRIMARY KEY AUTOINCREMENT, 
                   arrival TEXT, 
                   departure TEXT, 
                   availability INTEGER, 
                   stationID INTEGER, 
                   FOREIGN KEY(stationID) REFERENCES stations(_id))

schedule (_id INTEGER PRIMARY KEY AUTOINCREMENT, 
          trainID INTEGER, 
          day TEXT, 
          scheduleStationId INTEGER, 
          FOREIGN KEY(scheduleStationId) REFERENCES schedule_stations(_id))

到目前为止,我已经能够使用给定的 From 站设计 2 个查询:

            c1=db.rawQuery(
                "SELECT s2._id, name, departure, trainID " +
                        "FROM schedule_stations s1 INNER JOIN stations s2 " +
                        "ON s1.stationID = s2._id INNER JOIN schedule s3 " +
                        "ON s3.scheduleStationId = s1._id " +
                        "WHERE stationID=? ", 
                        new String[] {station1+""});

这给了我所有从提供的发件人站 (station1) 出发的信息。

并使用我拥有的 To 站:

            c2=db.rawQuery(
                "SELECT s2._id, name, arrival, trainID " +
                        "FROM schedule_stations s1 INNER JOIN stations s2 " +
                        "ON s1.stationID = s2._id INNER JOIN schedule s3 " +
                        "ON s3.scheduleStationId = s1._id " +
                        "WHERE stationID=? AND trainID IN ("+queryPlaceholders(strlist.size()-1)+")", 
                        strlist.toArray(new String[0]));

这为我提供了所有到达所提供的 To 车站的到达站,这些车站的 trainID 出现在第一个查询中(以保证连接)。

如果我单独输出它们看起来正确的游标(注意最后 3 个元素是:站名 | 时间 | trainID):

C1: Row: 0, Values: 1; Station A; 08:00; 1
C1: Row: 1, Values: 1; Station A; 12:00; 2
C2: Row: 0, Values: 2; Station B; 09:00; 1
C2: Row: 1, Values: 2; Station B; 13:00; 2

我想要的是以某种方式将这些合并到一个查询中,所以我最终只有一个光标可以用来填充我的 listadapter 和我的视图。MergeCursor 没有帮助,因为它只是添加了列,没有通过 trainID 链接它们。我尝试在查询之间使用 INNER JOIN 和 UNION,但遇到了语法错误。

假设上面的输出,我对单个查询的期望是一个提供 2 行的游标,每行有 2 个名称站和 2 个日期(到达/离开),因为这是我想在 android 视图的每一行中显示的信息。

4

1 回答 1

0
SELECT FromSch.trainID,
       FromSt.name,
       FromSchSt.departure,
       ToSt.name,
       ToSchSt.arrival
FROM    stations          FromSt
   JOIN schedule_stations FromSchSt ON FromSt._id = FromSchSt.stationID
   JOIN schedule          FromSch   ON FromSchSt._id = FromSch.scheduleStationId
   JOIN schedule          ToSch     ON FromSch.trainID = ToSch.trainID
                                   AND FromSch.day = ToSch.day
   JOIN schedule_stations ToSchSt   ON ToSch.scheduleStationId = ToSchSt._id
   JOIN stations          ToSt      ON ToSchSt.stationID = ToSt._id
WHERE  FromSt._id = ?
   AND ToSt._id = ?
-- AND FromSch.day = ?
于 2012-11-06T19:05:32.497 回答