Как мне решить эту ошибку, вызванную Pivot? - PullRequest
0 голосов
/ 29 марта 2020

При попытке развернуть мою таблицу - динамическую c, которую я не могу определить как записи, мои изменения могут быть добавлены или удалены - я получаю фатальную ошибку. Я использовал проверенный ответ от на этот вопрос и изменил его там, где это было необходимо. Вы увидите, что я использую AVG вместо SUM.

SET @sql = NULL;
SELECT
    GROUP_CONCAT(DISTINCT
        CONCAT(
          'AVG(IF(country = ''',
          country,
          ''', option_id, NULL)) AS ',
          country
        )
  ) INTO @sql
FROM
  (SELECT gspa.question_id AS question_id, sct.country AS country, gspa.option_id AS option_id
    FROM gs_poll_answers gspa 
    LEFT JOIN skill_cv_test sct ON sct.usr_id = gspa.user_id
    WHERE gspa.poll_id = 1) sctable;
SET @sql = CONCAT('SELECT gspa.question_id', @sql, ' FROM gs_poll_answers gspa LEFT JOIN skill_cv_test sct ON sct.usr_id = gspa.user_id WHERE gspa.poll_id = 1 GROUP BY gspa.question_id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Я получаю ошибку:

Fatal error: Uncaught TypeError: Argument 1 passed to PhpMyAdmin\Sql::resultSetHasJustOneTable() must be of the type array, boolean given, called in /usr/local/dh/web/phpmyadmin/libraries/classes/Sql.php on line 1908 and defined in /usr/local/dh/web/phpmyadmin/libraries/classes/Sql.php:143 Stack trace: #0 /usr/local/dh/web/phpmyadmin/libraries/classes/Sql.php(1908): PhpMyAdmin\Sql->resultSetHasJustOneTable(false) #1 /usr/local/dh/web/phpmyadmin/libraries/classes/Sql.php(2252): PhpMyAdmin\Sql->getQueryResponseForResultsReturned(true, Array, '1812apmy', 'gs_poll_answers', NULL, NULL, Object(PhpMyAdmin\Display\Results), './themes/pmahom...', '1', 0, NULL, NULL, NULL, NULL, NULL, 'SELECT\r\n\tGROUP_...', NULL) #2 /usr/local/dh/web/phpmyadmin/import.php(736): PhpMyAdmin\Sql->executeQueryAndGetQueryResponse(Array, false, '1812apmy', 'gs_poll_answers', NULL, NULL, NULL, NULL, NULL, NULL, 'tbl_sql.php', './themes/pmahom...', NULL, NULL, NULL, 'SELECT\r\n\tGROUP_...', NULL, NULL) #3 {main} thrown in /usr/local/dh/web/phpmyadmin/libraries/classes/Sql.php on line 143

На данный момент я понятия не имею, в чем проблема, кроме Идея, что он не может обрабатывать объединение в «От».

Является ли мой код проблемой, это сервер или что-то еще?

РЕДАКТИРОВАТЬ: Создать таблицы для skill_cv_test

CREATE TABLE `skill_cv_test` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `usr_id` int(32) NOT NULL,
 `category` int(16) NOT NULL COMMENT 'school_or_job',
 `comp_id` int(32) NOT NULL,
 `position` varchar(64) NOT NULL,
 `description` text,
 `country` varchar(16) NOT NULL,
 `state` varchar(16) NOT NULL,
 `city` varchar(64) NOT NULL,
 `start_date` date NOT NULL,
 `end_date` date DEFAULT NULL,
 `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=71 DEFAULT CHARSET=utf8

и gs_poll_answers

CREATE TABLE `gs_poll_answers` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `user_id` int(64) NOT NULL,
 `poll_id` int(64) NOT NULL,
 `question_id` int(64) NOT NULL,
 `option_id` int(64) NOT NULL,
 `vote_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=130 DEFAULT CHARSET=utf8

Ответы [ 3 ]

0 голосов
/ 29 марта 2020

Как я и подозревал, это не имеет ничего общего с вашим php.

Ваш запрос немного неправильный.

Отсутствует запятая Когда вы собираете все строки вместе, и я использовал двойные кавычки, mysql вообще не нравятся три '' '

SET @sql = NULL;
SELECT
    GROUP_CONCAT(DISTINCT
        CONCAT(
          'AVG(IF(country = '"',
          country,
          '"', option_id, NULL)) AS "',
          country,'"'
        )
  ) INTO @sql
FROM
  (SELECT gspa.question_id AS question_id, sct.country AS country, gspa.option_id AS option_id
    FROM gs_poll_answers gspa 
    LEFT JOIN skill_cv_test sct ON sct.usr_id = gspa.user_id
    WHERE gspa.poll_id = 1) sctable;
SET @sql = CONCAT('SELECT gspa.question_id,', @sql, ' FROM gs_poll_answers gspa LEFT JOIN skill_cv_test sct ON sct.usr_id = gspa.user_id WHERE gspa.poll_id = 1 GROUP BY gspa.question_id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
0 голосов
/ 29 марта 2020

Старайтесь избегать одинарных кавычек при объединении текста. Пример на основе вашего кода:

Примечание : в любом случае добавьте оператор IF, чтобы избежать выполнения в случае, если @sql является NULL

SET @sql = NULL;

SELECT
    GROUP_CONCAT(DISTINCT
        CONCAT('AVG(IF(sct.country = \'',sctable.country,'\',', option_id,', 0)) AS ',sctable.country)
    ) INTO @sql
FROM
  (SELECT gspa.question_id AS question_id, sct.country AS country, gspa.option_id AS option_id
    FROM gs_poll_answers gspa 
    LEFT JOIN skill_cv_test sct ON sct.usr_id = gspa.user_id
    WHERE gspa.poll_id = 1) sctable;

// at this point @sql should not be null    
IF @sql IS NOT NULL THEN

SET @sql = CONCAT('SELECT gspa.question_id AS question_id,', @sql, ' FROM gs_poll_answers gspa LEFT JOIN skill_cv_test sct ON sct.usr_id = gspa.user_id WHERE gspa.poll_id = 1 GROUP BY gspa.question_id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

END IF;
0 голосов
/ 29 марта 2020

Я нашел решение. Это не совсем решение проблемы и ошибки, а путь к желаемому решению. Запрашивая все существующие страны в таблице skill_cv_test, я могу создать часть необходимого кода, которая останется динамической c через for-l oop в PHP.

Например, «ВЫБЕРИТЕ страну ОТ skill_cv_test WHERE comp_id = 1». С помощью al oop я могу создать следующие строки: $qry .= "AVG(IF(sct.country = '.$row["country"].',option_id,NULL)) AS '.$row["country"].'". Благодаря такому подходу я могу достичь того же результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...