Я прочитал некоторые данные из базы данных. Для этого я группирую значения по «дате» и «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);
}
Кратко опишу, что я хочу: У меня есть следующие записи:
Первые две записи имеют одинаковую дату и одинаковый номер ustd. Это означает, что я хочу сгруппировать две записи. Это работает до сих пор. Однако я также хотел бы передать «2» (подсчитайте записи: 2 записи = выход 2, 3 записи = выход 3).
Мой вывод, который я хочу иметь:
Редактировать:
Я попробовал использовать 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.
Всегда позволяйте базе данных выполнять всю работу, это быстрее и эффективнее, чем использование 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».