Структурирование SQL Выход для одно и двухмерного массива - PullRequest
0 голосов
/ 24 апреля 2020

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

У меня есть таблица, структурированная для этого вопроса с данными и заголовками этого типа

enter image description here

Примечание: используется идентификатор для указанных c записей и с автоинкрементом
Примечание: Раздел заголовка используется для изоляции данных для определенных c проектов
Примечание: лицо может дублироваться для указанного c проекта
Примечание: Дата не будет дублироваться, но не обязательно будет организован
Примечание: для целей этого вопроса предположим, что данные организованы не так хорошо, и порядок должен произойти в SQL выражениях

Когда я использую phpmyadmin sql база данных

SELECT * FROM `This_Table` WHERE `Title` = 'Project_1' ORDER BY `Working_Date` ASC, `Worker_Name` ASC 

enter image description here

Это правильный вывод, который я хочу.

Здесь возникает проблема, я хочу использовать что-то близкое к array_agg, но возникла путаница при создании массивов массивов (двухмерных массивов), но я хочу использовать запрос SQL для новой таблицы чтобы я мог генерировать следующие массивы.

ВОПРОС: Может ли SQL предоставить вывод, который позволил бы мне иметь следующие массивы на основе вышеуказанных наборов данных?

#Unique Dates Organized ASC
$Date = array('2020-04-19', '2020-04-20', '2020-04-21', '2020-04-22', '2020-04-23', '2020-05-26', '2020-06-01');

#Names which by default will be unique in their own sub array by date 
#so in short a 2 dimensional array with Date then Persons
$Person = array(array('Joe', 'Mark'), array('Mark'), array('Joe', 'Mark'), array('Joe', 'Mark'), array('Mark'), array('Joe'), array('Joe'))

It звучит как тонна работы, но если бы SQL мог дать мне такой вывод точно, это сделало бы часть моего кодирования значительно проще. На этом этапе мне нужно вывести строки данных из SQL в мой PHP и построить массивы в самом коде PHP, а не SQL выводить массивы, подобные этому, и для больших баз данных это требует значительного количество времени для построения самого массива, не говоря уже о вызове уникальных данных.

1 Ответ

1 голос
/ 25 апреля 2020

Ниже приведен код и пояснения для создания каждого из массивов.

1. Первый массив довольно прост. Извлекайте отдельные записи из БД и загружайте массив. Код приведен ниже,

 <?php
 $link = mysqli_connect("localhost", "my_user", "my_password", "world");

 $query = "select distinct date from projects order by date asc";
 $result = mysqli_query($link, $query);

 /* numeric array */
 $datearray = mysqli_fetch_array($result, MYSQLI_NUM);
 ?>
Второй, который является массивом массива (скорее динамический c массив), немного хитрый. Сначала я сломаю подход, Шаг 1. MYSQL Агрегация group_concat используется для транспонирования строк в столбец. См. Ссылку Db fiddle для проверки подробностей - https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=5dd9a070c1d9a19bc16a5f4384672cc6

MySQL набор результатов запроса, как показано ниже, сгруппированы по дате в порядке возрастания даты. имена Джо, Марк Джо Джо, Марк

Шаг 2. В php прочитайте возвращенные записи транспонированных имен и используйте «взорвать», чтобы загрузить массив, разделив запятую строку. Это будет сделано для каждой записи, возвращенной в l oop. Шаг 3. Массив из вышеупомянутого далее загружается в другой массив.

 <?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "select names from (select dates,group_concat(person) as 'names' from projects group by dates order by dates asc) tab";
$result = mysqli_query($link, $query);
$namesarray = [];
while($row = mysqli_fetch_assoc($result))
    {
      $namestring = $row['names']
      $arrayofarray = explode(',', $$namestring); 
      $namesarray = array($arrayofarray);
    }
?>

PS: php код был проверен на любую синтаксическую ошибку. SQL запросы были успешно проверены на MySQL 8.0 База данных. Предполагается, что именем таблицы являются проекты.

Пожалуйста, обратитесь к ссылке DBfiddle для просмотра запроса SQL https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=85f2f88b2ec25ce1d8479a5f5df4d9bb

...