如何将逗号分隔的id从一行移到另一行?

时间:2015-02-26 11:06:21

标签: php sql

我有一个像这样的数据库表

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)并将其从test2移到test3,结果集将如下所示:

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做到这一点?

5 个答案:

答案 0 :(得分:1)

尽量不要在一列中存储逗号分隔值。 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的this。 我建议绑定值,因为你在谈论用户输入,这些输入总是可以被操纵,导致可能的安全漏洞。

答案 1 :(得分:1)

<?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 />";
?>

答案 2 :(得分:1)

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

注意
请按您的表名

更新 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);

答案 3 :(得分:0)

为什么不在添加product_ids时使用json_encode()。 插入产品ID时,只需编码并保存即可。 &安培;从文件夹移动时读取json并解码它。 在json中添加或删除相应的ID然后再次保存到数据库

答案 4 :(得分:0)

你有如何用PHP代码实现这个目标的答案。但你真的应该规范你的数据库。规范化数据库仅包含表,其中每个表包含描述特定实体的数据并通过外键与其他实体相关。您已经通过外键“user_id”连接您的用户数据,现在继续并将您的表重构为其他实体“文件夹”和“产品”。

您的最终架构可能如下所示:

表用户

user_id
user_name
etc.

表格文件夹

folder_id
folder_name
user_id
etc.

表格产品

product_id
folder_id
product_name
etc.

这样,要将产品从一个文件夹移动到另一个文件夹,只需从products-table更改记录的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/

此致 乔乔