我有一个像这样的数据库表
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做到这一点?
答案 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 :(
注意:
请按您的表名
这是一个解决方案:
<?
/**
* @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/
此致 乔乔