【发布时间】:2019-01-14 13:13:27
【问题描述】:
所以大家更新我的问题:我有一个 Delphi 2007 函数“ImportStudentMisses”:
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 应用程序使用,该应用程序将在数据库中插入 JSON 数据。这就是角色问题。
谢谢!!!
【问题讨论】:
-
为什么你不能用其他查询?
-
你想要三个查询的联合吗?在你的 JSON 中?或者您可以选择使用加入?
-
我需要将这三个查询变成一个 JSON @SayedMohdAli 无论如何都没关系。所以是的,我可以选择使用 join,但我还不太擅长 mysql
-
@PeterCoast 然后您可以使用 SQL 中的 union 合并 3 个查询的结果,然后您可以对结果进行 json_encode。
-
另一种方法,您可以运行 3 个查询并生成所有 3 个查询的 json,然后使用 => jsonArray1.concat(jsonArray2); 连接 json 对象
标签: php mysql json delphi delphi-2007