Как объединить несколько SQL-запросов в один для вывода в виде JSON в PHP-коде?

В настоящее время у меня установлена ​​следующая таблица:

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 

Выход JSON выглядит примерно так:

 { "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 } } } 

Поскольку я все еще изучаю PHP, я написал некоторый неаккуратный код, выполнив 3 запроса к базе данных, каждый раз выбирая все данные, где день был 1, 2 и 3.

Вот пример кода для получения данных для дня = 0, который повторяется для дня = 1 и дня = 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 ' }'; 

Я чувствую, что это может быть достигнуто только одним запросом, но, будучи тем, что я новичок, я не уверен, как его реализовать.

Я начал делать что-то вроде этого:

 $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); 

Однако я просто застрял и не совсем уверен, как подойти к нему дальше.

SQL:

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

Далее по коду:

 $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; } } 

Затем вы можете вывести его с помощью:

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

Вы можете не согласиться со мной, но я не думаю, что индексирование предметов с item0, item1 и т. Д …. или day0, day1 … является хорошей идеей. Я лично предпочитаю, чтобы циклический результат был следующим:

 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]]; } } 

В этом случае результатом будет массив объектов. то есть:

 [ { "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" } ] } ] 

Причина: вы можете легко перебирать все значения (массив) на любом языке, который собираетесь использовать.