Создать сводную таблицу на основе SQL-запроса из двух столбцов в переполнении стека

Я ищу некоторую помощь для создания универсальной функции PHP, которая будет принимать на выходе запроса SQL

ВЫБЕРИТЕ DISTINCT categoryID, StatusID, COUNT (*) ИЗ таблицыA GROUP BY categoryID

Пример результата:

CategoryID StatusID COUNT (*)
Категория B В ожидании 1
Категория A в ожидании 4
Категория C в ожидании 3
Категория B Проект 1

В базе данных может быть любое количество CategoryIDs и Status …

и вернуть табличный формат таблицы:

Мой желаемый результат выглядит примерно так:

         Сводная таблица статуса по категориям:
-------------------------------------------------- -------
| Категория А | Категория B | Категория C | ... | ВСЕГО
Завершено | 0 | 1 | 0 | ... | 1
В ожидании | 4 | 0 | 3 | ... | 7
Проект | 0 | 1 | 1 | ... | 2
-------------------------------------------------- -------
ИТОГО: | 4 | 2 | 4 | ... | 10

0

Решение

Я понял это! — Я надеюсь, что это поможет кому-то еще в будущем ..
Это не красивый код, но он работает, и он довольно генетический, поэтому его можно использовать по мере необходимости.
Кто это называется

$ sql = "ВЫБЕРИТЕ DISTINCT categoryID, statusID, COUNT (*) как Количество1 ОТ записей GROUP BY categoryID";
$ results = mysql_query ($ sql, $ con);

// Теперь, когда у нас есть и Status, и Category, давайте разместим счетчики в нужных ячейках:

echo displayTabularSum ($ myarray, "status", "category", 1);

Теперь функции, которые я использовал:


функция displayTabularSum ($ myarray, $ table1, $ table2, $ includeTotals)
{

// Сначала получаем все данные из $ table1 в массив
$ sql = "SELECT * FROM $ table1 WHERE 1";
$ results = mysql_query ($ sql);
$ statusCodes = getsqlresultintoarray ($ results);

// Второе: получить все данные из $ table2 в массив
$ sql = "SELECT * FROM $ table2 WHERE 1";
$ results = mysql_query ($ sql);
$ categoryCodes = getsqlresultintoarray ($ results);

// Теперь создаем таблицу результатов с соответствующими значениями в столбцах
$ StatusTable = массив ();
$ out = '';
$ first = true;
$ КТ = массив ();
для ($ x = 0; $ x ';
for ($ y = 0; $ y '. $ categoryCodes [$ y] [1].' ';
}
if ($ includeTotals) $ out. = 'Всего';
$ out. = '';
$ first = false;
}
$ out. = "";
$ out. = "". $ statusCodes [$ x] [1]. "";
$ Гт = 0;
для ($ y = 0; $ y ";
$ c1 = searchForId ($ categoryCodes [$ y] [0], $ myarray, "categoryID");
$ c2 = searchForId ($ statusCodes [$ x] [0], $ myarray, "statusID");
$ Count1 = 0;
$ Же = ($ c1 == $ c2);
Если ($ то же самое) {
Если ($ c1 == 99999 ИЛИ $ c2 == 99999) {
// ничего не делать ... Это NULL
} еще {

$ Count1 = $ count1 + $ MyArray [$ с1] [ 'Count1'];
}
}
$ out. = $ count1;
$ Rt = $ count1 + $ гт;
$ СТ [$ у] = $ сТ [$ у] + $ count1; // Сбор итогов столбца

$ out. = "";

}
if ($ includeTotals) $ out. = ''. $ rT. ''; // отображаем rowTotal
$ out. = "";

}
if ($ includeTotals) {// Показать столбец Total перед закрытием таблицы.
$ СТ1 = 0;
$ out. = "";
$ out. = 'Всего:';
для ($ x = 0; $ x '. $ cT [$ x].' ';
$ СТ1 = $ СТ1 + $ сТ [$ х];
}
$ out. = ''. $ cT1. '';
$ out. = "";
}
$ out. = "";

вернуть $ out;
} Функция getresultsintoarray1 ($ results)
{// Функция для получения всех результатов из SQL-запроса в массив.
$ num_rows = mysql_num_rows ($ results);
$ MyArray = массив ();
if ($ num_rows> 0) {
while ($ row = mysql_fetch_assoc ($ results))
{
$ myarray [] = $ row;
}
} еще
{
echo "В базе данных не найдено данных ...";

снята с охраны ($ MyArray);
$ MyArray = массив ();
}

вернуть $ myarray;
}
функция getsqlresultintoarray ($ get) // YES
{
$ num_rows = mysql_num_rows ($ get);
$ ReturnArray = массив ();
$ I = 0;
while ($ row1 = mysql_fetch_array ($ get)) {
$ ReturnArray [$ я] [0] = $ row1 [0]; // Это идентификатор
$ ReturnArray [$ я] [1] = $ row1 [1]; // Это имя
$ Я ++;
}

return $ returnArray;
} функция searchForId ($ id, $ array, $ field)
{
If (count ($ array)> 0) {
foreach ($ array as $ key => $ val) {
if ($ val [$ field] === $ id) {
вернуть ключ $;
}
}
}
возврат 99999;
}

Если у кого-то есть идеи относительно того, как его улучшить, я был бы признателен за это!

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]