繁体   English   中英

一个带有多个查询的 JSON

[英]One JSON with multiple queries

所以伙计们更新我的问题:我有一个“ImportStudentMisses”的Delphi 2007函数:

procedure TWeb.ImportStudentMisses;
var
  SLMisses, SLClasses: TStringList;
  i: Integer;
  idClass, idStudent: integer;
begin
  SLMisses := TStringlist.Create;
  SLMisses.Duplicates := dupIgnore;
  SLMisses.Sorted := true;

  SLClasses := TStringlist.Create;
  SLClasses.Duplicates := dupIgnore;
  SLClasses.Sorted := true;

  try
    FTexto := '[INTERNET] - Fase 1';
    Synchronize(DoStatus);

    qryDestino.SQL.Clear;
    qryDestino.SQL.Add('SELECT ClassID, StudentID ');
    qryDestino.SQL.Add(' FROM ' + Config.InternetConfig.prefix + 'MissOneClass ');
    qryDestino.SQL.Add(' ORDER BY ClassID, StudentID');
    qryDestino.Open;
    while not qryDestino.eof do
    begin
      SLAulas.Add(formatfloat('00000000', qryDestino.Fields[0].AsInteger));
      SLFaltas.Add(formatfloat('00000000', qryDestino.Fields[0].AsInteger) + '-' + qryDestino.Fields[1].asString);
      qryDestino.Next;
    end;

    FTexto := '[INTERNET] - Fase 2';
    Synchronize(DoStatus);

    qryDestino.Close;
    qryDestino.SQL.Clear;
    qryDestino.SQL.Add('SELECT Date, DisciplineID, StudentID ');
    qryDestino.SQL.Add(' FROM ' + Config.InternetConfig.prefix + 'MissTwoClasses ');
    qryDestino.SQL.Add(' ORDER BY Date, DisciplineID, StudentID');
    qryDestino.Open;
    while not qryDestino.eof do
    begin //local Table
      qryOrigem.SQL.Clear;
      qryOrigem.SQL.Add('SELECT lNum FROM Class');
      qryOrigem.SQL.Add('WHERE lDiscipline = ' + IntTostr(qryDestino.Fields[1].AsInteger));
      qryOrigem.SQL.Add('  AND lDate = ' + IntTostr(trunc(qryDestino.Fields[0].AsDateTime)));
      qryOrigem.Open;
      qryOrigem.First;
      while not qryOrigem.eof do
      begin
        idClass := qryOrigem.Fields[0].AsInteger;
        if idClass > 0 then
        begin
          SLClasses.Add(FormatFloat('00000000', idClass));
          SLMisses.Add(formatfloat('00000000', idClass) + '-' + qryDestino.Fields[2].asString);
        end;
        qryOrigem.Next;
      end;
      qryOrigem.Close;

      qryDestino.Next;
    end;

    FTexto := '[INTERNET] - Fase 3';
    Synchronize(DoStatus);

    qryDestino.Close;
    qryDestino.SQL.Clear;
    qryDestino.SQL.Add('SELECT Date, StudentID ');
    qryDestino.SQL.Add(' FROM ' + Config.InternetConfig.prefix + 'MissTheDay ');
    qryDestino.SQL.Add(' ORDER BY Date, StudentID');
    qryDestino.Open;

    while not qryDestino.eof do
    begin //Local Table
      qryOrigem.SQL.Clear;
      qryOrigem.SQL.Add('SELECT lNum FROM Class');
      qryOrigem.SQL.Add('WHERE lDate = ' + IntTostr(trunc(qryDestino.Fields[0].AsDateTime)));
      qryOrigem.Open;
      qryOrigem.First;
      while not qryOrigem.eof do
      begin
        idClass := qryOrigem.Fields[0].AsInteger;
        if idClass > 0 then
        begin
          SLClasses.Add(FormatFloat('00000000', idClass));
          SLMisses.Add(formatfloat('00000000', idClass) + '-' + qryDestino.Fields[1].asString);
        end;
        qryOrigem.Next;
      end;
      qryOrigem.Close;
      qryDestino.Next;
    end;
    qryDestino.Close;
    qryDestino.SQL.Clear;

    qryOrigem.Close;


    qryOrigem.SQL.Clear;
    qryOrigem.SQL.Add('DELETE FROM Misses WHERE lClass = :pClass');
    for i := 0 to SLClasses.Count - 1 do
    begin
      idClass := StrToIntDef(SLClasses[i], 0);
      qryOrigem.Params[0].AsInteger := idClass;
      qryOrigem.ExecSQL;
    end;

    qryOrigem.SQL.Clear;
    qryOrigem.SQL.Add('INSERT INTO Misses');
    qryOrigem.SQL.Add(' (lClass, lStudent) VALUES ');
    qryOrigem.SQL.Add(' (:pClass, :pStudent)');

    for i := 0 to SLMisses.Count - 1 do
    begin
      idClass := StrToIntDef(Copy(SLMisses[i], 1, 8), 0);
      idStudent := StrToIntDef(Trim(Copy(SLMisses[i], 10, 8)), 0);

      if (idClass > 0) and (idStudent > 0) then
      begin
        try
          qryOrigem.Params[0].AsInteger := idClass;
          qryOrigem.Params[1].AsInteger := idStudent;
          qryOrigem.ExecSQL;
        except
          on e: Exception do
          begin
            FTexto := '[INTERNET] - Error ' + E.Message;
            Synchronize(DoStatus);
          end;
        end;
      end;
    end;
  except
    on E: Exception do
    begin
      FTexto := '[INTERNET] - ' + E.Message;
      Synchronize(DoStatus);
      reconect;
    end;
  end;
  SLMisses.Free;
end;

此函数导入在相应日期错过课程的所有学生。 我必须让这个函数变成这样的 JSON:

[{"ClassID":10,"StudentsID":[1,2]},{"ClassID":20,"StudentsID":[3,4]}]

如您所见,JSON 具有 ("ClassID":10) 和缺少该课程的学生列表 ("Students":[1,2,3,4,5])。 我已经尝试了下面的代码来制作我想要的 JSON。

$query = $database->query( "SELECT ClassID, GROUP_CONCAT(StudentID) AS StudentID FROM {$pfx}MissOneClass
GROUP BY ClassID ORDER BY ClassID");
$list = array();
while ($row = $query->fetch(PDO::FETCH_ASSOC)) {
    $list[] = array('ClassID' => $row['ClassID'], 
    'StudentID' => array_map('intval', explode(',', $row['StudentID'])));
    }
echo json_encode($list);

我已经找回了这个 JSON:

[{"ClassID":1,"StudentsID":[1,2,3,4]},{"ClassID":2,"StudentsID":[3,4,23]}]

JSON 是我需要的 JSON。 但有人告诉我,我必须像我一样使用所有表,而不仅仅是“MissOneClass”。

此 JSON 将由 JAVA 应用程序使用,该应用程序将在 DB 上插入 JSON 数据。 这就是角色问题。

谢谢!!!

在 Union 中,您使用的所有 3 个表中的列数应该相同。 检查 union 和 union all 之间的区别。 在您的数据库上运行查询以检查结果。

SELECT ClassID, StudentID, null as Date, null as DisciplineID
FROM MissOneClass
union all
SELECT null as ClassID,StudentID, Date, DisciplineID
FROM MissTwoClasses
union all
SELECT null as ClassID, StudentID, Date, null as DisciplineID
FROM MissTheDay
ORDER BY Date, DisciplineID, ClassID, StudentID

您也可以使用 join,它仍然令人困惑,您希望以何种方式合并 JSON,这 2 种会产生不同的结果。 在这种情况下,我假设学生 ID 是外键。

SELECT ClassID, StudentID, Date, DisciplineID
FROM MissOneClass mo full outer join MissTwoClasses mt on mt.StudentID = mo.StudentID full outer join MissTheDay md md.StudentID = mo.StudentID

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM