Como combinar várias consultas SQL em uma para saída como JSON no código PHP?

Eu atualmente tenho a tabela a seguir configurada:

StartTime EndTime Performer Event Day Location ----------------------------------------------------- 1:00pm 2:00pm Test Test 0 1 11:00pm 12:00am Test Test 0 0 2:00pm 2:30pm Test Test 1 0 11:00pm 12:00am Test Test 2 1 

A saída JSON parece algo assim:

 { "day0": { "item1": { "StartTime": "1:00pm", "EndTime": "2:00pm", "Performer": "Test", "Event": "Test", "Location": 1 }, "item2": { "StartTime": "11:00pm", "EndTime": "12:00am", "Performer": "Test", "Event": "Test", "Location": 0 } }, "day1": { "item1": { "StartTime": "2:00pm", "EndTime": "2:30pm", "Performer": "Test", "Event": "Test", "Location": 0 } }, "day2": { "item1": { "StartTime": "11:00pm", "EndTime": "12:00am", "Performer": "Test", "Event": "Test", "Location": 1 } } } 

Uma vez que ainda estou aprendendo PHP, escrevi um código descuidado ao fazer 3 consultas no database, selecionando todos os dados onde o dia era 1, 2 e 3.

Aqui está um exemplo de código para obter dados para o dia = 0, que é repetido para o dia = 1 e dia = 2:

 echo '{ "day0" : {'; $sql = "select * from table WHERE day = 0"; $result = mysqli_query($connection, $sql) or die("Error in Selecting " . mysqli_error($connection)); $jsonData = array(); $rowCount = $result->num_rows; $index = 1; while($row =mysqli_fetch_assoc($result)) { echo '"item'.$index.'":'; echo json_encode(array("StartTime" => $row['StartTime'], "EndTime" => $row['EndTime'], "Performer" => $row['Performer'], "Event" => $row['Event'], "Location" => intval($row['Location']))); if ($rowCount != $index) { echo ','; } ++$index; } echo ' }'; // Repeated code for day=1 // Repeated code for day=2 echo ' }'; 

Eu sinto como se isso pudesse ser alcançado com apenas uma consulta, mas sendo que sou novidade, não tenho certeza de como implementá-la.

Comecei a fazer algo como isto:

 $sql = "select * from table"; $result = mysqli_query($connection, $sql) or die("Error in Selecting " . mysqli_error($connection)); $jsonData = array(); $numOfRows = $result->num_rows; $count = 1; while($row = mysqli_fetch_assoc($result)) { $outerIndex = 'day'.$row['day']; if ($row['day'] == '1') { // Do something, not sure } if ( !isset( $jsonData[$outerIndex] ) ) { $innerIndex = 'item'.$count.''; $jsonData[$outerIndex][$innerIndex] = $row; } ++$count; } echo json_encode($jsonData); 

No entanto, acabei por ficar preso e não tenho certeza de como abordá-lo ainda mais.

SQL:

 $sql = "SELECT * FROM table ORDER BY Day"; 

Mais abaixo no código:

 $result_object = []; $item = 1; while ($row = $result->fetch_assoc()) { if(isset($result_object['day'.$row['Day']])) { $result_object['day'.$row['Day']]['item'.$item] = $row; $item++; } else { $result_object['day'.$row['Day']]['item1'] = $row; $item = 2; } } 

Você pode então exibi-lo com:

 echo json_encode($result_object, JSON_PRETTY_PRINT); //JSON_PRETTTY_PRINT is not necessary... 

Você pode não concordar comigo, mas não penso em indexar itens com item0, item1 e assim por diante …. ou day0, day1 … é uma boa idéia. Eu pessoalmente prefiro que o loop do resultado seja:

 while ($row = $result->fetch_assoc()) { if(isset($result_object[$row['Day']])) { $result_object[$row['Day']]->items[] = $row; } else { $result_object[$row['Day']] = (object)['day'=>$row['Day'], 'items'=>[$row]]; } } 

Nesse caso, o resultado seria uma série de objects. ou seja:

 [ { "day": "0", "items": [ { "StartTime": "07:23:56", "EndTime": "17:24:04", "Performer": "Performer1", "Event": "Event1", "Day": "0", "Location": "1" }, { "StartTime": "09:24:30", "EndTime": "01:04:37", "Performer": "Performer2", "Event": "Event2", "Day": "0", "Location": "1" } ] }, { "day": "1", "items": [ { "StartTime": "10:25:22", "EndTime": "11:25:29", "Performer": "Performer2", "Event": "Event3", "Day": "1", "Location": "2" } ] }, { "day": "2", "items": [ { "StartTime": "12:26:08", "EndTime": "13:26:12", "Performer": "Performer3", "Event": "Event4", "Day": "2", "Location": "1" } ] } ] 

O motivo: você pode facilmente iterar através de cada valor (uma matriz) em qualquer idioma que você vai usar.