如何将逗号分隔的ID从一行移动到另一行


How to move comma seperated ids from one row to another row?

我有一个类似的数据库表

Id user_id folder product_ids

1            4              test1        2,3,4
2            4              test2        7,8,9
3            4              test3        10,11,12

在这里,我保存了以逗号分隔的产品ID。用户已经创建了这样的文件夹,并希望将一个或多个产品移动到另一个文件夹。比方说,如果用户想要,他可以选择产品id(8),并将其从测试2移动到测试3,结果集将如下所示:

Id user_id folder product_ids

1            4              test1        2,3,4
2            4              test2        7,9
3            4              test3        10,11,12,8

如何使用sql和php?

不幸的是,MySQL没有内置的REPLACEbyREGEX:(

注意
请按您的表名更新PRODUCT_TABLE

这里有一个解决方案:

 <?
    /**
      * @param String $folderSrc
      * @param String $folderDst
      * @param String $movedProductIds
      * @param String $userId
      * @return String Built SQL Query
      */
    function buildSqlQueryMoveProductId ($folderSrc, $folderDst, $movedProductIds, $userId) {
    return 
        "UPDATE PRODUCT_TABLE 
         SET PRODUCT_IDS = 
            CASE
                WHEN FOLDER = '" . $folderSrc . "' THEN (REPLACE (REPLACE (REPLACE (PRODUCT_IDS, '," . $movedProductIds . "', ''), '" . $movedProductIds . ",', ''), '" . $movedProductIds . "', ''))
                WHEN FOLDER = '" . $folderDst . "' THEN (CONCAT (IF (LENGTH(PRODUCT_IDS) > 0, CONCAT (PRODUCT_IDS, ','), '' ), '" . $movedProductIds . "'))
                ELSE PRODUCT_IDS
            END
        WHERE USER_ID = " . $userId;
    }
    // Example
    print moveProductId ('test1', 'test2', '3', 4);

尽量不要将逗号分隔的值存储在一列中。MySQL可以完美地处理大型表,因此您可以将每个产品ID作为单独的行输入。

您还可以创建多个表,例如一个表包含文件夹数据。然后,另一个表可以保存文件夹表的主键,以及产品ID和用户ID。

你在一张桌子上存放的东西越多,它就越没有条理。我不确定什么是最好的表现,但组织是关键,尤其是以后

编辑:

假设你创建一个这样的表:

ID  User_ID  Folder Product_ID
1   4        test1  2
2   4        test2  7
3   4        test3  10

您现在可以简单地查找Product_ID,并更新文件夹名称。因此,当您将产品ID传递到更新脚本时,您可以使用类似以下的查询:

UPDATE your_table_name SET Folder = :folder WHERE Product_ID = :pid

然后绑定文件夹名称和产品ID。如果你不熟悉准备好的陈述,请阅读这篇关于PDO的文章。我建议绑定这些值,就像您谈论的用户输入一样,它总是可以被操纵,从而可能导致安全漏洞。

<?php
/*Fetch your product ids and you will return sting of ids like "1,2,3,4,5,6,7"
 * 
 */

// product Ids. From where you want to remove id
$productOne="1,2,3,4,5";
// product Ids, From where you want to put id
$productTwo="6,7,8,9";
//product 1 array
$productOneArray=explode(",",$productOne);
//product 2 array
$productTwoArray=explode(",",$productTwo);
//Id which you want to change
$movingId = "5";
//Let's remove your product.
foreach ($productOneArray as $key=>$id){
    if($id == $movingId){
        unset($productOneArray[$key]);
    }
}//BINGO !! you remove your id

//Add it to another product ids
array_push($productTwoArray,$movingId);
//Bingo You did it

//now turn both into string
$productOne=implode(",",$productOneArray);
$productTwo=implode(",",$productTwoArray);
//Update both the values in database
?>

如果你需要更多的印地语或古吉拉特语帮助,你可以问我。

如果你想移动多个ID

<?php
$name="parag";
if($name=="parag"){
    echo uniqid().$name;
}
?>
<script>
    $("div").css("width", "100px");
    $("div").css("height", "100px");
</script>
<?php
echo "<pre>";
/*Fetch your product ids and you will return sting of ids like "1,2,3,4,5,6,7"
 * 
 */

// product Ids. From where you want to remove id
$productOne="1,2,3,4,5";
// product Ids, From where you want to put id
$productTwo="6,7,8,9";
//product 1 array
$productOneArray=explode(",",$productOne);
//product 2 array
$productTwoArray=explode(",",$productTwo);
//Id which you want to change
$movingId = "2,3,4";
$movingIdArray = explode(",", $movingId);
//Let's remove your product.
foreach($movingIdArray as $movingIds){
    foreach ($productOneArray as $key=>$id){
        if($id == $movingIds){
            unset($productOneArray[$key]);
        }
    }//BINGO !! you remove your id
}
print_r($productOneArray);

//Add it to another product ids
array_push($productTwoArray,$movingId);
//Bingo You did it

//now turn both into string
$productOne=implode(",",$productOneArray);
$productTwo=implode(",",$productTwoArray);
//Update both the values in database
echo "productOne = ".$productOne."<br />";
echo "productTwo = ".$productTwo."<br />";
?>

为什么不在添加product_id时使用json_encode()。当您插入产品id时,只需对其进行编码并保存即可&从文件夹中移出时,读取json并对其进行解码。从json中添加或删除相应的id,然后再次保存到数据库

您得到了关于如何使用php代码实现这一点的答案。但您确实应该规范化您的数据库。规范化数据库只包含表,其中每个表都包含描述某个实体的数据,并通过外键与其他实体相关。您已经通过外键"user_id"连接了用户数据,现在继续将表重构到其他实体"文件夹"answers"产品"。

您的最终模式可能如下所示:

表格用户

user_id
user_name
etc.

表文件夹

folder_id
folder_name
user_id
etc.

桌上产品

product_id
folder_id
product_name
etc.

这样,要将产品从一个文件夹移动到另一个文件夹,只需更改products表中记录的folder_id即可。要从一个文件夹中提取所有产品,请使用联接:

SELECT folders.*, products.* from products
JOIN folders on folders.folder_id = products.folder_id
WHERE folders.folder_id = your_desired_folder_id

在这里阅读更多关于数据库规范化的信息,包括许多示例和为什么要这样做(尽管您已经面临问题):http://www.dbnormalization.com/

谨致问候,jojo