Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中循环以创建串联变量_Mysql_Wordpress_Metadata - Fatal编程技术网

在MySQL中循环以创建串联变量

在MySQL中循环以创建串联变量,mysql,wordpress,metadata,Mysql,Wordpress,Metadata,我有一个Wordpress网站,它在wp_ratings表中存储了帖子评级,每个评级都存储为一行。我们将很快改变主题,需要将wp_评级中存储的值转换为元数据,如下所示: 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";

我有一个Wordpress网站,它在wp_ratings表中存储了帖子评级,每个评级都存储为一行。我们将很快改变主题,需要将wp_评级中存储的值转换为元数据,如下所示:

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 sumrating_rating中每个post的总值,然后将元数据创建为一个长字符串

我真的不知道从哪里开始,所以如果有人能给我指出正确的方向,我将非常感激


谢谢

我对存储过程了解不多,但我认为您只需使用group_concat和group by post id进行一次查询就可以做到这一点。

设置测试数据 查询 结果@post_id=3 结论 我还无法编写一个查询,返回带有post_ID及其新元数据的结果集

以上代码将仅在邮寄基础上转换


如果您想批量更新,需要更多的思考,但我认为这会让您有一个良好的开端。

第10行缺少分号。我没有足够的权限更正它。打开的第一个支架永远不会关闭。这使得解决方案变得模棱两可!第一个大括号包含其中的所有单个条目。结束大括号应该在语句的每一端。你是说第一个大括号不需要结束,因为它不是?你能发布元数据规范吗?不幸的是,我本身没有元数据规范,但这个论坛帖子应该解释它是如何工作的。还有jonlester,是的,第一个支架应该关闭-我错漏了。这样行吗?每个单独评级开始处的“i”值目前在数据库中不存在,因此我认为需要一个用作计数器的变量…?不,使用COUNT*函数,如果行组合在一起,它将返回数字。您可以在查询中直接写入COUNT*。嗨,谢谢,这太棒了。但有一个问题——有些帖子的评分超过1500次,因此这些帖子的元数据长度大约为90000个字符。这个解决方案在投票数很少的情况下工作,所以我如何将查询全部发送到字符串?当我在MySQL Workbench中运行查询时,它只将字符串返回为“BLOB”,而在Sequel Pro中,它将获得第四次投票,然后不再继续。不知道这是否只是一个显示限制。可能会尝试将该值插入另一个表中,以查看它是否返回完整的字符串。@Andy,try:SET SESSION group\u concat\u max\u len=1000000;完美的最后一个问题-我调整了它,以显示按post_id分组的结果,并希望将其导入到“wp_Posteta”表中,但当我使用insert select语句时,会出现错误。将在下面发布查询:设置会话组\u concat\u max\u len=1000000;在wp_Posteta中插入'post_id'、'meta_key'、'meta_value'选择rating_postid、'like',CONCAT'a:'、sumrating_rating':{',从选择CONCAT'i:'、@curRow:=@curRow+1'中选择CONCAT组_CONCAT meta_数据投票分隔符',};a:2:{s:7:','user_id','s:1:0;s:2:ip;s:16:','-127-000-000-001',';}作为元数据
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
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";}}