Цикл в MySQL для создания объединенной переменной - PullRequest
2 голосов
/ 22 января 2012

У меня есть сайт Wordpress, в котором рейтинги записей хранятся в таблице wp_ratings, причем каждый рейтинг хранится в виде отдельной строки. В ближайшее время мы будем менять тему и должны преобразовать значения, хранящиеся в wp_ratings, в метаданные, которые будут выглядеть следующим образом:

a: 3: {
i: 0;
a: 2: {
    s: 7: "user_id";
    s: 1: "0";
    s: 2: "ip";
    s: 9: "127.0.0.1";
}
i: 1;
a: 2 {
    s: 7: "user_id";
    s: 1: "0";
    s: 2: "ip";
    s: 9: "127.0.0.1";
}
i: 2;
a: 2: {
    s: 7: "user_id";
    s: 1: "0";
    s: 2: "ip";
    s: 9: "127.0.0.1";
}
i: 3;
a: 2: {
    s: 7: "user_id";
    s: 1: "0";
    s: 2: "ip";
    s: 9: "127.0.0.1";
}

Суммарное значение голосования отображается a:3 в начале отчета, а затем для каждого рейтинга сохраняется индивидуальная запись.

Я не особенно знаком с хранимыми процедурами, но я хочу создать цикл, который будет вычислять общее значение для каждого сообщения в wp_posts sum(rating_rating), а затем создавать метаданные в одну длинную строку.

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

Спасибо

Ответы [ 2 ]

1 голос
/ 23 января 2012

Настройка тестовых данных

CREATE TABLE `wp_ratings` ( 
  `rating_id` INT(11) NOT NULL AUTO_INCREMENT, 
  `rating_postid` INT(11) NOT NULL, 
  `rating_posttitle` TEXT NOT NULL, 
  `rating_rating` INT(2) NOT NULL, 
  `rating_timestamp` VARCHAR(15) NOT NULL, 
  `rating_ip` VARCHAR(40) NOT NULL, 
  `rating_host` VARCHAR(200) NOT NULL, 
  `rating_username` VARCHAR(50) NOT NULL, 
  `rating_userid` INT(10) NOT NULL DEFAULT '0', 
  PRIMARY KEY  (`rating_id`), 
  KEY `rating_postid` (`rating_postid`) 
); 

INSERT INTO `test`.`wp_ratings` 
  (`rating_id`, `rating_postid`, `rating_posttitle`, 
  `rating_rating`, `rating_timestamp`, `rating_ip`, 
  `rating_host`, `rating_username`, `rating_userid`)
  VALUES
  (1,1,'title',1,'abc','127.0.0.1','a.a.a','user_id',1),
  (2,2,'title',1,'abc','127.0.0.1','a.a.a','user_id',1),
  (3,2,'title',1,'abc','127.0.0.1','a.a.a','user_id',1),
  (4,3,'title',1,'abc','127.0.0.1','a.a.a','user_id',1),
  (5,3,'title',1,'abc','127.0.0.1','a.a.a','user_id',1),
  (6,3,'title',1,'abc','127.0.0.1','a.a.a','user_id',1);

Запрос

SET @post_id = 3;

SELECT CONCAT
(
'a:', COUNT(rating_id), ':{',
    (
        SELECT CONCAT( GROUP_CONCAT(meta_data_vote SEPARATOR ''), '}') FROM
        (
            SELECT CONCAT
            ( 
                'i:',
                @curRow := @curRow + 1,
                ';a:2:{s:7:"', 
                rating_username, 
                '";s:1:"0";s:2:"ip";s:9:"', 
                rating_ip,
                '";}'
            )AS meta_data_vote
            FROM
                wp_ratings
            JOIN (SELECT @curRow := -1 AS j) r
            WHERE rating_postid = @post_id
        )AS meta_data_votes
    )
) AS new_ratings_meta_data
FROM wp_ratings l
WHERE rating_postid = @post_id

Результат (где @post_id = 3)

a:3:{i:0;a:2:{s:7:"user_id";s:1:"0";s:2:"ip";s:9:"127.0.0.1";}i:1;a:2:{s:7:"user_id";s:1:"0";s:2:"ip";s:9:"127.0.0.1";}i:2;a:2:{s:7:"user_id";s:1:"0";s:2:"ip";s:9:"127.0.0.1";}}

Заключение

Мне не удалось написать запрос, который возвращает набор результатов с post_ids и их новыми метаданными.

Приведенный выше код будет конвертироваться только пост-пост.

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

0 голосов
/ 22 января 2012

Я не знаю много о хранимых процедурах, но я думаю, что вы можете сделать это с помощью одного запроса, используя group_concat () и группировать по идентификатору поста.

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