2009-08-11 21 views
335

पर आधारित अद्यतन क्वेरी दिनांक-समय पर आधारित दो घटनाओं के बीच कोई संबंध होने पर मुझे (उसी तालिका से) जांचने की आवश्यकता है।MySQL - SELECT क्वेरी

डेटा के एक सेट में कुछ घटनाओं का समापन दिनांक-समय होगा और डेटा के दूसरे सेट में अन्य घटनाओं के लिए प्रारंभिक दिनांक-समय होगा।

यदि पहला कार्यक्रम दूसरे कार्यक्रम से पहले पूरा हो जाता है तो मैं उन्हें लिंक करना चाहता हूं।

क्या मैं अब तक है:

SELECT name as name_A, date-time as end_DTS, id as id_A 
FROM tableA WHERE criteria = 1 


SELECT name as name_B, date-time as start_DTS, id as id_B 
FROM tableA WHERE criteria = 2 

तब मैं उन्हें शामिल:

SELECT name_A, name_B, id_A, id_B, 
if(start_DTS > end_DTS,'VALID','') as validation_check 
FROM tableA 
LEFT JOIN tableB ON name_A = name_B 

मैं तो, मेरे validation_check क्षेत्र के आधार पर, का चयन करें नेस्टेड के साथ एक अद्यतन क्वेरी चलाने कर सकते हैं?

+1

मुझे यकीन है कि तुम क्या कह रहे हैं नहीं कर रहा हूँ? क्या आप एसक्यूएल चयन के साथ अद्यतन करने का तरीका जानने का प्रयास कर रहे हैं? – RiddlerDev

उत्तर

573

आप वास्तव में यह एक दो तरीकों में से कर सकते हैं:

update tableA a 
left join tableB b on 
    a.name_a = b.name_b 
set 
    validation_check = if(start_dts > end_dts, 'VALID', '') 

एएनएसआई SQL सिंटैक्स:

update tableA set validation_check = 
    (SELECT if(start_DTS > end_DTS,'VALID','') as validation_check 
     FROM tableA 
     LEFT JOIN tableB ON name_A = name_B 
     WHERE id_A = tableA.id_A) 

पिक जो भी आपके लिए सबसे अधिक प्राकृतिक लगता है

MySQL अद्यतन वाक्य रचना में शामिल हो।

+75

पहला फॉर्म (शामिल होने के साथ अपडेट) दूसरे की तुलना में * बहुत * अधिक कुशल होगा। पहला एक एकल जुड़ाव करेगा, जबकि दूसरा टेबल ए की प्रत्येक पंक्ति के लिए चयन क्वेरी निष्पादित करेगा। – ColinM

+12

पहले उदाहरण के लिए, क्या आप आंतरिक जुड़ने का उपयोग नहीं करना चाहिए? बाएं से जुड़ने के परिणामस्वरूप validation_check को तालिका के लिए शून्य पर सेट किया जा रहा है एक रिकॉर्ड के बिना रिकॉर्ड एक रिकॉर्ड बी रिकॉर्ड? – Cerin

+3

@ सेरिन हाँ जो मेरे साथ हुआ। यह आंतरिक शामिल होना चाहिए! या बस इसे शामिल होने के रूप में छोड़ दें। यदि आपके भीतर आंतरिक शामिल नहीं है, तो बाएं शामिल होने का अर्थ है कि सभी तालिका ए रिकॉर्ड अपडेट हो जाएंगे! यह बहुत खतरनाक है! – CMCDragonkai

43

यदि कोई डेटा किसी डेटाबेस से दूसरे डेटाबेस में डेटा अपडेट करना चाहता है, इससे कोई फर्क नहीं पड़ता कि वे किस तालिका को लक्षित कर रहे हैं, ऐसा करने के लिए कुछ मानदंड होना चाहिए।

यह एक बेहतर और सभी स्तरों के लिए साफ है:

update dbname1.content targetTable 

left join dbname2.someothertable sourceTable on 
    targetTable.compare_field= sourceTable.compare_field 
set 
    targetTable.col1 = sourceTable.cola 
    ,targetTable.col2 = sourceTable.colb 
    ,targetTable.col3 = sourceTable.colc 
    ,targetTable.col4 = sourceTable.cold 

Traaa! यह बहुत अच्छा काम करता है!

उपर्युक्त समझ के साथ, आप अपने काम करने के लिए सेट फ़ील्ड और "ऑन" मानदंडों को संशोधित कर सकते हैं। आप चेक भी कर सकते हैं, फिर डेटा को अस्थायी तालिका में खींचें और फिर अपनी तालिका और कॉलम नामों को प्रतिस्थापित करने वाले उपरोक्त वाक्यविन्यास का उपयोग करके अद्यतन चलाएं।

उम्मीद है कि यह काम करता है, अगर मुझे नहीं पता है। मैं आपके लिए एक सटीक क्वेरी लिखूंगा।

195
UPDATE table1 dest, (SELECT * FROM table2 where id=x) src 
    SET dest.col1 = src.col1 where dest.id=x ; 

आशा है कि यह आपके लिए काम करता है।

+2

यह अब तक की सबसे तेज़ क्वेरी है। संपादित करें: 22 के पंक्तियों के साथ भाग लेने और 4K पंक्तियों के साथ स्रोत होने पर, इसे पूरा करने के लिए 1 सेकंड से कम समय लिया गया, जबकि 60 सेकंड से ऊपर का शीर्ष उत्तर। –

+1

हां, यह सबसे तेज़ प्रश्न है, बीटीडब्ल्यू आप जहां भी जोड़ सकते हैं – robinmag

+0

अच्छी क्वेरी। 5 स्टार – Zubair

9
UPDATE 
    receipt_invoices dest, 
    (SELECT 
    `receipt_id`, 
    CAST((net * 100)/112 AS DECIMAL (11, 2)) witoutvat 
    FROM 
    receipt 
    WHERE CAST((net * 100)/112 AS DECIMAL (11, 2)) != total 
    AND vat_percentage = 12) src 
SET 
    dest.price = src.witoutvat, 
    dest.amount = src.witoutvat 
WHERE col_tobefixed = 1 
    AND dest.`receipt_id` = src.receipt_id ; 

आशा है कि इससे आपको ऐसी स्थिति में मदद मिलेगी जहां आपको दो तालिकाओं के बीच मिलान करना और अपडेट करना होगा।

9

मुझे यह प्रश्न एक जटिल जटिल जुड़ने के लिए अपने स्वयं के समाधान की तलाश में मिला। यह एक वैकल्पिक समाधान है, समस्या के एक और जटिल संस्करण के लिए, जो मैंने सोचा कि उपयोगी हो सकता है।

मुझे गतिविधियों तालिका में product_id फ़ील्ड को पॉप्युलेट करने की आवश्यकता है, जहां एक इकाई में गतिविधियां गिने जाते हैं, और इकाइयों को एक स्तर में गिना जाता है (एक स्ट्रिंग ?? एन का उपयोग करके पहचाना जाता है), जैसे कोई एसकेयू का उपयोग करके गतिविधियों की पहचान कर सकता है यानी एल 1 यू 1 ए 1। उन एसकेयू को फिर एक अलग मेज में संग्रहीत किया जाता है।

मैं पहचान product_id बनाम activity_id की एक सूची प्राप्त करने के लिए निम्न: -

SELECT a.activity_id, w.product_id 
FROM activities a 
JOIN units USING(unit_id) 
JOIN product_types USING(product_type_id) 
JOIN web_products w 
    ON sku=CONCAT('L',SUBSTR(product_type_code,3), 'U',unit_index, 'A',activity_index) 

मैंने पाया कि वह भी mysql के भीतर एक का चयन में शामिल करना जटिल था, तो मैं एक अस्थायी तालिका बनाया है, और शामिल हो गए है कि

CREATE TEMPORARY TABLE activity_product_ids AS (<the above select statement>); 

UPDATE activities a JOIN activity_product_ids b ON a.activity_id=b.activity_id 
    SET a.product_id=b.product_id; 

मैं किसी को पाता है यह उपयोगी

66

MySQL में आराम से आशा:

-: अद्यतन बयान के साथ 10
UPDATE users AS U1, users AS U2 
SET U1.name_one = U2.name_colX 
WHERE U2.user_id = U1.user_id 
+0

मेरे पास एक समान प्रश्न है, और मुझे आश्चर्य है कि मैं अपनी स्थिति के साथ कुछ ऐसा कर सकता हूं: https://stackoverflow.com/questions/47948052/mysql-wordpress-records-update – MagicMiles

4

आप आंतरिक का उपयोग कर एक और मेज से मूल्यों को अपडेट कर सकते इस

UPDATE [table1_name] AS t1 INNER JOIN [table2_name] AS t2 ON t1.column1_name] = t2.[column1_name] SET t1.[column2_name] = t2.column2_name]; 

की तरह शामिल हो कैसे इस क्वेरी http://www.voidtricks.com/mysql-inner-join-update/

उपयोग करने के लिए या आप कुछ चुनिंदा उपयोग कर सकते हैं के रूप में सबक्वेरी इस

करने के लिए पता करने के लिए यहाँ का पालन करें
UPDATE [table_name] SET [column_name] = (SELECT [column_name] FROM [table_name] WHERE [column_name] = [value]) WHERE [column_name] = [value]; 

क्वेरी यहाँ विवरण में विस्तार से बताया http://www.voidtricks.com/mysql-update-from-select/

4
UPDATE [table_name] AS T1, 
     (SELECT [column_name] 
     FROM [table_name] 
     WHERE [column_name] = [value]) AS T2 
    SET T1.[column_name]=T2.[column_name] + 1 
WHERE T1.[column_name] = [value]; 
2

आप उपयोग कर सकते हैं:

UPDATE Station AS st1, StationOld AS st2 
    SET st1.already_used = 1 
WHERE st1.code = st2.code 
0

एक ही मेज के लिए,

UPDATE PHA_BILL_SEGMENT AS PHA, 
    (SELECT BILL_ID, COUNT(REGISTRATION_NUMBER) AS REG 
     FROM PHA_BILL_SEGMENT 
     GROUP BY REGISTRATION_NUMBER, BILL_DATE, BILL_AMOUNT 
     HAVING REG > 1) T 
    SET PHA.BILL_DATE = PHA.BILL_DATE + 2 
WHERE PHA.BILL_ID = T.BILL_ID; 
संबंधित मुद्दे