Как перемещать разделенные запятыми идентификаторы из одной строки в другую?

У меня есть таблица базы данных, подобная этой

Id user_id folder product_ids

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

Здесь я сохранил идентификаторы продуктов, разделенные запятыми. Пользователи создали свои папки, подобные этому, и хотели переместить один или несколько продуктов в другую папку. Скажем, если пользователь хочет, чтобы он мог выбрать идентификатор продукта (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?

К сожалению, у 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); 

Старайтесь не хранить значения, разделенные запятыми, в одном столбце. MySQL может отлично обрабатывать большие таблицы, поэтому вы можете вводить каждый идентификатор продукта в отдельную строку.

Вы также можете создать несколько таблиц, например, сохранить данные папки. Затем в другой таблице могут храниться первичные ключи таблицы папок, а также идентификаторы продуктов и идентификатор пользователя.

Чем больше вы храните в одной таблице, тем менее организованной она становится. Я не уверен, что лучше всего по производительности, но организация является ключевым, особенно позже.

РЕДАКТИРОВАТЬ:

Итак, скажем, вы создаете таблицу следующим образом:

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

Теперь вы можете просто найти Product_ID и ОБНОВИТЬ имя папки. Поэтому, когда вы передаете идентификатор продукта на сценарий обновления, вы можете использовать запрос примерно так:

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

Затем привяжите имя папки и идентификатор продукта. Пожалуйста, прочтите это о 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 ?> с <?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 ?> 

Если вам нужна дополнительная помощь на хинди или гуджрати, вы можете спросить меня.

Если вы хотите переместить несколько идентификаторов

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

Почему вы не используете json_encode () при добавлении product_ids. Когда вы вставляете идентификатор продукта, просто закодируйте его и сохраните. & во время перемещения из папки читайте, что json и декодирует его. Добавьте или удалите соответствующие идентификаторы из json, затем снова сохраните в базе данных

Вы получили ответы о том, как это сделать с помощью php-кода. Но вы действительно должны нормализовать свою базу данных. Нормализованная база данных содержит только таблицы, в которых каждая таблица содержит данные, описывающие определенный объект, и относится к другим объектам через внешние ключи. Вы уже сделали это, подключив свои пользовательские данные через внешний ключ «user_id», теперь переходите и реорганизуйте свою таблицу в другие папки «папка» и «продукт».

Ваша окончательная схема может выглядеть так:

Пользователи таблицы

 user_id user_name etc. 

Настольные папки

 folder_id folder_name user_id etc. 

Настольные продукты

 product_id folder_id product_name etc. 

При этом, чтобы переместить продукт из одной папки в другую, просто измените файл 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