अन्य तालिका से मान के साथ mysql अद्यतन स्तंभ


221

मेरे पास दो टेबल हैं, दोनों दिख रही हैं

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

मैं के मान की प्रतिलिपि की जरूरत valueसे tableAकरने के लिए tableBप्रत्येक तालिका में जांच के नाम पर आधारित है।

इस UPDATEकथन के लिए कोई सुझाव ?

जवाबों:


413

इस उत्तर के अलावा अगर आपको tableB.value को तालिका के अनुसार बदलने की आवश्यकता है। गतिशील रूप से आप उदाहरण के लिए कर सकते हैं:

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
ग्रेट स्फिंक्स

यह काम नहीं करता है। TableB में अभी भी अपना डेटा w / o चेंज है। 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'

अद्यतन १

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

अद्यतन २

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

1
अलग-अलग नामों और मूल्य के साथ 1k से अधिक रिकॉर्ड करें, यहां आपका रिकॉर्ड सिर्फ 1 रिकॉर्ड के लिए है
लियोसम

आप केवल अपनी आवश्यकताओं के आधार पर खंड whereको हटा सकते हैं या खंड को संशोधित कर whereसकते हैं ..
जॉन वू

तालिका A की तुलना में तालिका B को अधिक रिकॉर्ड मिला, मेरा विचार तालिका B से जाँच है यदि नाम मौजूद है "तालिका" के मान को कॉपी करें B,!
लियोसम

मुझे नहीं पता कि अगर मैं आपके प्रश्न को स्पष्ट रूप से समझ पाया, तो क्या आप मेरे अपडेट किए गए उत्तर की जांच कर सकते हैं?
जॉन वू

मैंने दोनों को अपडेट करने की कोशिश की, दूसरा कहता है कि 734 पंक्तियों पर लिखा हुआ है, मैंने मूल्यों की जांच की अभी भी सभी 0 नहीं बदले हैं
लियोसम

91

दूसरी संभावना है,

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

7
हां, जटिल जोड़ की कोई आवश्यकता नहीं है, जब हमें जरूरत है कि किसी अन्य तालिका से मान के साथ एक फ़ील्ड को अपडेट करना है।
दाविदकोनराड

8
हां यह ठीक काम करता है लेकिन बड़े डेटासेट पर बहुत धीमा है। यदि आप छोटे तालिकाओं के साथ काम कर रहे हैं तो यह तरीका ठीक है लेकिन मैं जोइन की सलाह देता हूं जैसा कि ऊपर कुछ और के लिए दिखाया गया है।
frijj2k

इसके अलावा, इस स्थिति में, तालिका A और B SQL बाधाओं के कारण समान तालिका नहीं हो सकती है।
मुहू

@ frijj2k यह अभी भी धीमा होगा यदि .nameदोनों तालिकाओं पर अनुक्रमित किया जाए?
स्टेवरिनो

3

यदि आप सुरक्षित अपडेट मोड का उपयोग कर रहे हैं, तो दूसरा विकल्प भी संभव है (और आपको यह इंगित करने में त्रुटि हो रही है कि आपने WHERE के बिना एक तालिका को अपडेट करने की कोशिश की है, जिसमें एक कुंजी स्तंभ का उपयोग किया गया है):

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

मेरे मामले में, स्वीकृत समाधान बहुत धीमा था। 180K पंक्तियों वाली तालिका के लिए अद्यतनों की दर लगभग 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. तालिका -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();
    }


}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.