簡體   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