অন্য সারণী থেকে মান সহ mysql আপডেট কলাম


221

আমার দু'টি টেবিল রয়েছে, দু'জনের মতোই

id  name  value
===================
1   Joe     22
2   Derk    30

আমি এর মান কপি করা আবশ্যক valueথেকে tableAথেকে tableBপ্রতিটি টেবিলে চেক নামের উপর ভিত্তি করে।

এই UPDATEবিবৃতি জন্য কোন টিপস ?

উত্তর:


412

এই উত্তরটি ছাড়াও আপনার যদি টেবিলএ.ভ্যালু অনুসারে টেবিল বি.মূল্য পরিবর্তন করতে হয় তবে গতিশীলভাবে আপনি এটি করতে পারেন:

UPDATE tableB
INNER JOIN tableA ON tableB.name = tableA.name
SET tableB.value = IF(tableA.value > 0, tableA.value, tableB.value)
WHERE tableA.name = 'Joe'

হ্যাঁ, INNER JOINএই পরিস্থিতিতে নিখুঁত। আমি CONCAT_WSঅন্য টেবিল থেকে প্রুডাক্ট নাম এবং এসকিউ মার্জ করতাম
ভ্লাদক্রাস

2
এলিয়াস ব্যবহার করে এটি করার কোনও উপায় আছে কি?
জেলি অ্যান

আমি এটি চেষ্টা করেও কোনও সাফল্য পাইনি, কারণ "প্রভাবিত সারি" গণনা আমাকে 5690 দেয় তবে মোট সারিগুলি 59643, কেন? এটিই হ'ল ক্যোয়ারী:UPDATE participants_registrations INNER JOIN participants ON participants.id = participants_registrations.participantId INNER JOIN registrations ON registrations.id = participants_registrations.registrationId LEFT JOIN groups ON (groups.id = registrations.groupId) SET registrations.groupId = groups.id, registrations.groupName = groups.name, participants.memberOfGroupName = groups.name
গ্রেট স্পিনস

এটি কাজ করে না। টেবিলবিটির নিজস্ব ডেটা ডাব্লু / ও পরিবর্তন হচ্ছে। wtools.io/paste-code/bzWA ওপিতে এবং এই উত্তরের উপর ভিত্তি করে একটি নমুনা।
স্নিফিংডোগো

157

আপনার দুটি সারণিতে যোগদান করতে হবে:

উদাহরণস্বরূপ আপনি nameটেবিলএ থেকে তাদের মানটি tableBযেখানে অনুলিপি করতে চান সেখানেID

UPDATE tableB t1 
        INNER JOIN tableA t2 
             ON t1.id = t2.id
SET t1.name = t2.name 
WHERE t2.name = 'Joe'

আপডেট 1

UPDATE tableB t1 
        INNER JOIN tableA t2 
             ON t1.id = t2.id
SET t1.name = t2.name 

আপডেট 2

UPDATE tableB t1 
        INNER JOIN tableA t2 
             ON t1.name = t2.name
SET t1.value = t2.value

1
বিভিন্ন নাম এবং মান সহ 1 কে রেকর্ড
আইভ

আপনার প্রয়োজনের উপর ভিত্তি করে আপনি কেবল ক্লজটি সরিয়ে whereবা ক্লজটি সংশোধন করতে পারবেন where..
জন উ

এছাড়াও টেবিল বি টেবিল এ এর ​​চেয়ে বেশি রেকর্ড পেয়েছে, আমার ধারণাটি টেবিল বি থেকে একটিতে চেক করা হয় যদি নাম উপস্থিত থাকে তবে "মান" এর মানটি টেবিল বিতে অনুলিপি করে!
লিওসাম

আমি জানি না আমি আপনার প্রশ্নটি পরিষ্কারভাবে বুঝতে পেরেছি, আপনি কি আমার আপডেট হওয়া উত্তরটি পরীক্ষা করতে পারবেন?
জন উঃ

আমি উভয় আপডেটের চেষ্টা করেছিলাম, ২ য় জন বলেছেন যে 34৪34 সারিতে প্রভাবিত হয়েছে, আমি এখনও মানগুলি যাচাই করেছিলাম এখনও 0 টি পরিবর্তন হয়নি
লিওসাম

91

দ্বিতীয় সম্ভাবনা হ'ল,

UPDATE TableB 
SET TableB.value = (
    SELECT TableA.value 
    FROM TableA
    WHERE TableA.name = TableB.name
);

7
হ্যাঁ, জটিল সংযুক্ত হওয়ার দরকার নেই, যখন আমাদের কেবল দরকার অন্য টেবিলে মান সহ একটি ক্ষেত্র আপডেট করা।
ডেভিডকনরাদ

8
হ্যাঁ এটি দুর্দান্ত কাজ করে তবে বড় ডেটাসেটগুলিতে খুব ধীর। আপনি যদি ছোট টেবিলগুলি নিয়ে কাজ করছেন তবে এই পদ্ধতিটি ঠিক আছে তবে আমি অন্য কোনও কিছুর জন্য উপরে প্রদর্শিত হিসাবে যোগদানের প্রস্তাব দিই।
frijj2k

এছাড়াও, এই দৃশ্যে, এসকিউএল সীমাবদ্ধতার কারণে টেবিল A ​​এবং B একই টেবিল হতে পারে না।
মুহু

@ frijj2k যদি এখনও .nameউভয় টেবিলে সূচিযুক্ত হয় তবে এটি ধীর হবে ?
স্টিভেরিনো

3

দ্বিতীয়টি বিকল্পটি সম্ভব হয় যদি আপনি নিরাপদ আপডেট মোড ব্যবহার করেন (এবং আপনি একটি কেই কলাম ব্যবহার করে এমন একটি WHEE ছাড়াই একটি টেবিল আপডেট করার চেষ্টা করেছেন তা নির্দেশ করে একটি ত্রুটি পাচ্ছেন):

UPDATE TableB  
SET TableB.value = (  
SELECT TableA.value  
    FROM TableA  
    WHERE TableA.name = TableB.name  
)  
**where TableB.id < X**  
;


1

টেম্প টেবিলে আপনার ডেটা সংরক্ষণ করুন

Select * into tempTable from table1

এবার কলামটি আপডেট করুন

 UPDATE table1
    SET table1.FileName = (select FileName from tempTable where tempTable.id = table1.ID);

0

আমার ক্ষেত্রে, গৃহীত সমাধানটি খুব ধীর ছিল। 180 কে সারি সহ একটি টেবিলের জন্য আপডেটের হার প্রতি সেকেন্ডে প্রায় 10 সারি ছিল। এটি যুক্ত হওয়ার উপাদানগুলির সূচকগুলির সাথে।

আমি শেষ পর্যন্ত একটি পদ্ধতি ব্যবহার করে আমার সমস্যা সমাধান করেছি:

CREATE DEFINER=`my_procedure`@`%` PROCEDURE `rescue`()
BEGIN
    declare str VARCHAR(255) default '';
    DECLARE n INT DEFAULT 0;
    DECLARE i INT DEFAULT 0;
    DECLARE cur_name VARCHAR(45) DEFAULT '';
    DECLARE cur_value VARCHAR(10000) DEFAULT '';
    SELECT COUNT(*) FROM tableA INTO n;
    SET i=0;
    WHILE i<n DO 
      SELECT namea,valuea FROM tableA limit i,1 INTO cur_name,cur_value;
      UPDATE tableB SET nameb=cur_name where valueb=cur_value;
      SET i = i + 1;
    END WHILE;

END

আমি আশা করি এটি ভবিষ্যতে কাউকে যেমন সহায়তা করেছে তেমনভাবে সহায়তা করবে


-4

যদি উভয় টেবিলে আপনার সাধারণ ক্ষেত্র থাকে তবে এটি এত সহজ! ....

সারণী -১ = সারণি যেখানে আপনি আপডেট করতে চান। সারণী -২ = সারণি যেখানে আপনি ডেটা নেন।

  1. সারণী -১ এ ক্যোয়ারী তৈরি করুন এবং সাধারণ ক্ষেত্রের মান সন্ধান করুন।
  2. একটি লুপ তৈরি করুন এবং সারণী 1 মান অনুসারে সারণী -2 থেকে সমস্ত ডেটা সন্ধান করুন।
  3. আবার সারণী 1 এ আপডেট ক্যোয়ারী করুন।

$qry_asseet_list = mysql_query("SELECT 'primary key field' FROM `table-1`");

$resultArray = array();
while ($row = mysql_fetch_array($qry_asseet_list)) {
$resultArray[] = $row;
}



foreach($resultArray as $rec) {

    $a = $rec['primary key field'];

    $cuttable_qry = mysql_query("SELECT * FROM `Table-2` WHERE `key field name` = $a");

    $cuttable = mysql_fetch_assoc($cuttable_qry);



    echo $x= $cuttable['Table-2 field']; echo " ! ";
    echo $y= $cuttable['Table-2 field'];echo " ! ";
    echo $z= $cuttable['Table-2 field'];echo " ! ";


    $k = mysql_query("UPDATE `Table-1` SET `summary_style` = '$x', `summary_color` = '$y', `summary_customer` = '$z' WHERE `summary_laysheet_number` = $a;");

    if ($k) {
        echo "done";
    } else {
        echo mysql_error();
    }


}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.