Подсчет сгруппированных данных в Moodle

Я прочитал некоторые данные из базы данных. Для этого я группирую значения по «дате» и «ustd».

Могу ли я заранее посчитать, сколько «ustd» он суммировал?

Я прочитал данные следующим образом:

$lbtbs = $DB->get_records('lbtb_schulzentrum', null, 'date,ustd', 'id,date,ustd,eintrag,sus,bgcolor');

Затем я запускаю его через цикл foreach:

foreach ($lbtbs as $lbtb) {
    $data[$lbtb->date][$lbtb->ustd] = array("date" => $lbtb->date, "id" => $lbtb->id, "start" => $lbtb->ustd, "description" => $lbtb->eintrag, "sus" => $lbtb->sus, "color" => $lbtb->bgcolor);
}

Кратко опишу, что я хочу: У меня есть следующие записи:

идентификатор дата УСТД 1 2024-08-22 1 2 2024-08-22 1 3 2024-08-22 2 4 2024-08-22 2 5 2024-08-22 3

Первые две записи имеют одинаковую дату и одинаковый номер ustd. Это означает, что я хочу сгруппировать две записи. Это работает до сих пор. Однако я также хотел бы передать «2» (подсчитайте записи: 2 записи = выход 2, 3 записи = выход 3).

Мой вывод, который я хочу иметь:

идентификатор дата УСТД считать 1 2024-08-22 1 2 3 2024-08-22 2 2 5 2024-08-22 3 1

Редактировать:

Я попробовал использовать COUNT. К сожалению, данные, которые подсчитываются, больше не выводятся.

$lbtbs = $DB->get_records_sql('SELECT id,date,ustd,bgcolor,sus, COUNT(sus) FROM {lbtb_schulzentrum}');

$data = array();

foreach ($lbtbs as $lbtb) {
    $data[$lbtb->date][$lbtb->ustd] = array("date" => $lbtb->date, "id" => $lbtb->id, "start" => $lbtb->ustd, "color" => $lbtb->bgcolor);
}

Решение: GROUP BY отсутствовал, и COUNT(*) AS считался для доступа к значению.

$lbtbs = $DB->get_records_sql('SELECT id,date,ustd,bgcolor,sus, COUNT(*) AS count FROM {lbtb_schulzentrum} GROUP BY date,ustd');

🤔 А знаете ли вы, что...
PHP поддерживает расширения для работы с множеством сторонних сервисов и API.


1
51
2

Ответы:

Решено

Всегда позволяйте базе данных выполнять всю работу, это быстрее и эффективнее, чем использование PHP-кода.

SQL-агрегат

COUNT() — агрегатная функция, например SUM(), MIN(), MAX()

При использовании агрегатных функций вам необходимо использовать имена столбцов GROUP BY.

В вашем случае это будет что-то вроде

GROUP BY date, ustd

Вам нужно будет использовать группу в каждом столбце вашего SELECT

Также полезно использовать псевдоним для столбца счетчика, например:

COUNT() AS mycount

Уникальный столбец

В Moodle первый столбец функции $DB->get_records_sql() должен иметь уникальное значение.

Столбец id в таблице lbtb_schulzentrum имеет уникальное значение, но немного бессмысленно для GROUP BY, поскольку он возвращает каждую строку.

Поэтому используйте concat, чтобы соединить столбцы date и ustd, чтобы создать уникальный идентификатор. Кроме того, Moodle может использовать несколько разных баз данных, поэтому воспользуйтесь функцией совместимости $DB->sql_concat()

$DB->sql_concat('date', 'ustd')

См. https://moodledev.io/docs/4.4/apis/core/dml#sql_concat

Окончательный код

Итак, ваш окончательный sql должен выглядеть так

$sql = "SELECT " . $DB->sql_concat('date', 'ustd') . " AS uniqueid, date, ustd, COUNT() AS mycount
        FROM {lbtb_schulzentrum}
        GROUP BY date, ustd";

$lbtbs = $DB->get_records_sql($sql);

Имена столбцов

И еще подсказка: date — это зарезервированное имя столбца.

https://docs.moodle.org/dev/XMLDB_reserved_words

Поэтому, если ваш код используется в разных базах данных, он может сломаться.

При создании таблиц я бы рекомендовал использовать редактор XMLDB.

Перейдите в «Администрирование сайта» > «Разработка» > «Редактор XMLDB».


Вам просто нужно group by, поставить лайк

SELECT min(id) as id, min(date) as date,ustd COUNT(sus) FROM {lbtb_schulzentrum} GROUP BY ustd