Как передать значение поля в общетабличное выражение (CTE) в C?

Как изменить запрос, чтобы правильно пробросить значение поля в MariaDB для вывода списка всех названий подразделений пользователей, включая вершину и разделитель?
  • 9 октября 2023 г. 16:37
Ответы на вопрос 1
В C для передачи значения поля в общетабличное выражение (CTE) можно использовать параметр. Ниже представлен пример кода на языке C, демонстрирующий передачу значения поля в CTE:

```c
#include <stdio.h>
#include <mysql/mysql.h>

int main() {
    MYSQL *connection = mysql_init(NULL);

    if (connection == NULL) {
        fprintf(stderr, "Ошибка инициализации: %s\n", mysql_error(connection));
        return 1;
    }

    if (mysql_real_connect(connection, "hostname", "username", "password", "database", 0, NULL, 0) == NULL) {
        fprintf(stderr, "Ошибка подключения: %s\n", mysql_error(connection));
        return 1;
    }

    char *departmentName = "Example Department";

    char query[200];
    sprintf(query, "WITH cte AS (SELECT * FROM departments WHERE name = '%s') SELECT * FROM cte", departmentName);

    if (mysql_query(connection, query)) {
        fprintf(stderr, "Ошибка выполнения запроса: %s\n", mysql_error(connection));
        return 1;
    }

    MYSQL_RES *result = mysql_store_result(connection);
    if (result == NULL) {
        fprintf(stderr, "Ошибка получения результата: %s\n", mysql_error(connection));
        return 1;
    }

    int num_fields = mysql_num_fields(result);

    MYSQL_ROW row;
    while ((row = mysql_fetch_row(result))) {
        for (int i = 0; i < num_fields; i++) {
            printf("%s ", row[i] ? row[i] : "NULL");
        }
        printf("\n");
    }

    mysql_free_result(result);
    mysql_close(connection);

    return 0;
}
```

Для корректного передачи значения поля name в MariaDB для вывода списка всех названий подразделений пользователей, включая вершину и разделитель, можно использовать функцию CONCAT с условием UNION ALL:

```sql
SELECT name FROM departments WHERE parent_id IS NULL -- Вершина
UNION ALL
SELECT CONCAT(parent.name, ' > ', child.name) FROM departments child
JOIN departments parent ON child.parent_id = parent.id
```
Похожие вопросы