Подсчет сгруппированных данных в 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');

Какое сообщение об ошибке вы получаете?

Lajos Arpad 22.08.2024 19:29

Я немного изменил запрос. Сообщение об ошибке возникло из-за знака «,». Однако когда я подсчитываю значения, эти точные данные больше не выводятся. Я перечислил свой SQL-запрос выше в разделе «Редактировать:».

Sascha 22.08.2024 20:10

Я думаю, это из-за цикла foreach. Я предполагаю, что не могу вывести несколько записей, подсчитываемых одновременно?

Sascha 22.08.2024 20:28

Чтобы помочь, мне нужно знать сообщение об ошибке, которое вы получаете.

Lajos Arpad 22.08.2024 23:42

У меня больше нет сообщения об ошибке. Проблема, с которой я столкнулся сейчас, заключается в том, что он выводит только один набор данных на основе COUNT(). Но мне нужно несколько.

Sascha 23.08.2024 05:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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».

Спасибо за подробное объяснение! Это отлично работает, и я даже очень хорошо понимаю объяснения!

Sascha 23.08.2024 14:09

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

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

Другие вопросы по теме