请原谅我缺乏合适的问题标题,但我的问题如下
我有一个表格,其中包含如下所示的数据:
mysql> select * from tablex;
+-------+---------+-----+
| id | post_id | pid |
+-------+---------+-----+
| 14549 | 7195 | 27 |
| 14551 | 7195 | 34 |
| 14556 | 7195 | 1 |
| 14564 | 7196 | 51 |
| 14566 | 7196 | 11 |
| 14571 | 7196 | 37 |
| 14576 | 7197 | 36 |
| 14578 | 7198 | 11 |
| 14586 | 7199 | 15 |
| 14612 | 7201 | 42 |
+-------+---------+-----+
当我对重复项进行计数时,我得到这样的数据结构:
mysql> select count(*), post_id from tablex group by post_id;
+----------+---------+
| count(*) | post_id |
+----------+---------+
| 3 | 7195 |
| 3 | 7196 |
| 1 | 7197 |
| 1 | 7198 |
| 1 | 7199 |
| 1 | 7201 |
+----------+---------+
我正在寻找如何使用 php/mysql 最好地操作上述数据的想法,以将表格更新为如下所示
mysql> select * from tabley order by meta_id desc;
+---------+---------+------------------+---------------+
| meta_id | post_id | meta_key | meta_value |
+---------+---------+------------------+---------------+
| 7575 | 7195| multiple | 3 |
| 7574 | 7195| multiple_0 | 27 |
| 7573 | 7195| multiple_1 | 34 |
| 7572 | 7195| multiple_2 | 1 |
| | | | |
+---------+---------+------------------+---------------+
您会注意到 post_id 7195 出现 3 次,因此第一步是将meta_key倍设置为 3。
下一步是运行循环并创建键 0-2 并创建元键 mutiple_0 - multiple_2并插入对应于 post_id 7195 的值 27,34,1,从表 x 中可以看出......实现此目的的最简单方法是什么?
这是代码。不要忘记更改服务器名称,用户名,密码和数据库
$conn = mysqli_connect('localhost', 'root', 'password','database');
$sql=mysqli_query($conn,"select count(*) as count,post_id from tablex group by post_id");
while($row=mysqli_fetch_array($sql)){
$count[]=$row["count"];
$postid[]=$row["post_id"];
}
foreach (array_combine($postid,$count) as $pid=>$cnt){
for($i=0;$i<=$cnt;$i++){
$pstid = $pid;
if($i==0){
$multiple = "multiple";
$meta= $cnt;
}
else{
$x=$i-1;
$multiple = "multiple_".$x;
$query=mysqli_query($conn,"select pid from tablex where post_id='$pid'");
while($row=mysqli_fetch_array($query)){
$id[]=$row["pid"];
}
$meta = $id[$i-1];
}
$query2=mysqli_query($conn,"INSERT INTO tabley(post_id,meta_key,meta_value) VALUES('$pid','$multiple','$meta')");
}
}
此操作只能使用 mysql
INSERT INTO tabley (
post_id,
meta_key,
meta_value
) SELECT
t1.post_id,
'multiple' AS multiple,
COUNT(*)
FROM tablex AS t1 GROUP BY t1.post_id
UNION
SELECT
t2.post_id,
REPLACE(
CONCAT(
'multiple_',
@curRow:=CASE
WHEN @postId = t2.post_id THEN @curRow + 1
ELSE 0
END,
@postId:=t2.post_id
),
t2.post_id,
''
) AS multiple,
t2.pid
FROM tablex AS t2
ORDER BY post_id, multiple;
第一部分是INSERT ... SELECT
mysql语法。UNION
第二个选择。您可以在没有INSERT
的情况下测试SELECT
第二部分是获取具有相似post_id
的行的行号。