![](/img/trans.png)
[英]How to combine multiple SQL queries into one to output as JSON in PHP code?
[英]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.