एक क्वेरी में दो तालिकाओं से हटाएं


84

मेरे पास MySQL में दो टेबल हैं

#messages table  : 
messageid
messagetitle 
.
.

#usersmessages table 
usersmessageid 
messageid
userid
.
.

अब अगर मैं संदेश तालिका से हटाना चाहता हूं तो यह ठीक है। लेकिन जब मैं संदेश को संदेश के माध्यम से हटाता हूं तो रिकॉर्ड अभी भी उपयोगकर्ता के नाम पर मौजूद है और मुझे एक ही बार में इस दो तालिकाओं से हटाना होगा।

मैंने निम्नलिखित प्रश्न का उपयोग किया:

DELETE FROM messages LEFT JOIN usersmessages USING(messageid) WHERE messageid='1' ; 

फिर मैंने परीक्षा दी

   DELETE FROM messages , usersmessages 
   WHERE messages.messageid = usersmessages.messageid 
   and messageid='1' ; 

लेकिन ये दोनों प्रश्न इस कार्य को पूरा नहीं कर रहे हैं।

जवाबों:


137

क्या आप उन्हें अर्धविराम द्वारा अलग नहीं कर सकते?

Delete from messages where messageid = '1';
Delete from usersmessages where messageid = '1'

या

बस INNER JOINनीचे के रूप में उपयोग करें

DELETE messages , usersmessages  FROM messages  INNER JOIN usersmessages  
WHERE messages.messageid= usersmessages.messageid and messages.messageid = '1'

1
अगर मैं इस कोड को एक लूप में रखना चाहता हूं तो क्या होगा? मुझे पता है कि मैं अर्धविराम बिल्कुल लगा सकता हूं।
mehdi

1
इसे लूप में डाला जा सकता है। आप इसे प्रोग्रामेटिक रूप से कर सकते हैं और संदेश आईडी को एक पैरामीटर के रूप में भेज सकते हैं। जब तक आप इसे उसी आईडी पर नहीं भेजते रहेंगे, तब तक यह डिलीट नहीं करेगा।
एरिक

4
यदि आप इसे दो प्रश्नों में करते हैं, तो आपको वास्तव में इसे लेनदेन में लपेटना चाहिए। हटाए गए प्रश्नों को लूप में चलाने के लिए, आप सभी डिलीट को करने के लिए एक क्वेरी बनाने से बेहतर हैं।
JohnFx

1
चेक क्वेरी डिलीट क्वेरी का एक और उदाहरण जुड़ता है bennadel.com/blog/…
Babar

21
SQL सर्वर के साथ काम नहीं करता है: ',' के पास गलत सिंटैक्स।
पॉल-सेबेस्टियन मैनोल

45
DELETE a.*, b.* 
FROM messages a 
LEFT JOIN usersmessages b 
ON b.messageid = a.messageid 
WHERE a.messageid = 1

अनुवाद: तालिका संदेशों से हटाएं जहां संदेश = 1 है, यदि तालिका uersmessages में संदेश संदेश = तालिका संदेशों का संदेश है , तो uersmessages तालिका की उस पंक्ति को हटा दें


सभी के लिए टिप्पणी: जैसा कि इस छूट में दिखाया गया है, यह निर्दिष्ट करना महत्वपूर्ण है कि किस तालिका में काम करना चाहिए। ग्रेट पोस्ट @angry_kiwi
राफेल_ बीपी

मैं सिर्फ आदेश को बदलने के लिए था, उपयोगकर्ताओं से बी खण्ड में संदेश छोड़ दें
पाब्लो

15

आपको या तो FOREIGN KEYसाथ बनाना चाहिए ON DELETE CASCADE:

ALTER TABLE usersmessages
ADD CONSTRAINT fk_usermessages_messageid
FOREIGN KEY (messageid)
REFERENCES messages (messageid)
ON DELETE CASCADE

, या लेन-देन में दो प्रश्नों का उपयोग करके करते हैं:

START TRANSACTION;;

DELETE
FROM    usermessages
WHERE   messageid = 1

DELETE
FROM    messages
WHERE   messageid = 1;

COMMIT;

लेनदेन केवल InnoDBतालिकाओं को प्रभावित करता है , हालांकि।


3
आप एक क्वेरी में कई तालिकाओं से हटा सकते हैं ! dev.mysql.com/doc/refman/5.0/en/delete.html
txwikinger

हाँ तुम कर सकते हो! लेकिन मेरे लिए ... मेरे उत्तर ने जो कहा वह करना आसान है।
एरिक

मैंने उसी तरह की मेज पर झरना जोड़ा। जब मैंने केवल 1 तालिका से हटाने का प्रयास किया, तो उसने रिकॉर्ड को हटा दिया और संबंधित एक अनाथ को छोड़ दिया। अड़चन क्या है?
बरफून

@बारफून: आपकी टेबल है InnoDB?
क्वासोई

@Quassnoi उफ़! मैंने निश्चित रूप से सोचा था कि यह एक नासमझ था। सभी टेबल MyISAM हैं। क्या मैं उन सभी को उनमें डेटा के साथ फ्लाई पर बदल सकता हूं? या उस के साथ कोई समस्या है?
बर्फ़ून

7

आपके पास दो विकल्प हैं:

सबसे पहले, लेन-देन के अंदर दो कथन दें:

BEGIN;
  DELETE FROM messages WHERE messageid = 1;
  DELETE FROM usermessages WHERE messageid = 1;
COMMIT;

या, आप एक विदेशी कुंजी के साथ सेट पर सेट कर सकते हैं। यह बेहतर तरीका है।

CREATE TABLE parent (
  id INT NOT NULL,
    PRIMARY KEY (id)
);

CREATE TABLE child (
  id INT, parent_id INT,
  FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE
);

आप यहाँ पर DELETE CASCADE के बारे में अधिक पढ़ सकते हैं ।



6
DELETE message.*, usersmessage.* from users, usersmessage WHERE message.messageid=usersmessage.messageid AND message.messageid='1'

6

ओपी डिलीट होने के बाद सिर्फ टेबल अलायर्स को मिस कर रहा है

DELETE t1, t2 
FROM table1 t1 LEFT JOIN table2 t2 ON t1.id = t2.id 
WHERE t1.id = some_id

3
आपके उत्तर के लिए धन्यवाद। यह अधिक उपयोगी होगा यदि आप यह समझाने की कोशिश करें कि यह क्यों काम करेगा और ओपी समाधान क्यों नहीं किया गया।
DdW

1

कृपया इसे आजमाएँ

DELETE FROM messages,usersmessages

USING messages

INNER JOIN usermessages on (messages.messageid = usersmessages.messageid)

WHERE messages.messsageid='1'

0

इसे इस्तेमाल करे..

DELETE a.*, b.*  
FROM table1 as a, table2 as b  
WHERE a.id=[Your value here] and b.id=[Your value here]

मैंने idएक नमूना स्तंभ के रूप में जाने दिया ।

खुशी है कि यह मदद करता है। :)


ताकि तारांकन ( *) सही तरीके से प्रस्तुत हो, आपको क्वेरी को इसके सामने 4 स्थानों के साथ इंडेंट करने की आवश्यकता है।
अल.जी.

0

आप इस तरह का भी उपयोग कर सकते हैं, विशेष मूल्य को हटाने के लिए जब दोनों स्तंभों में एक ही या कई समान नाम हो।

DELETE project , create_test  FROM project INNER JOIN create_test
WHERE project.project_name='Trail' and  create_test.project_name ='Trail' and project.uid= create_test.uid = '1';

0

एक और तरीका है जिसका यहां उल्लेख नहीं किया गया है (मैंने पूरी तरह से अभी तक इसका प्रदर्शन नहीं किया है), आप सभी तालिकाओं के लिए सरणी सेट कर सकते हैं -> वे पंक्तियाँ जिन्हें आप नीचे हटाना चाहते हैं

// set your tables array
$array = ['table1', 'table2', 'table3'];


// loop through each table
for($i = 0; $i < count($array); $i++){

 // get each single array
 $single_array = $array[$i];

 // build your query
 $query = "DELETE FROM $single_array WHERE id = 'id'";

 // prepare the query and get the connection
 $data = con::GetCon()->prepare($query);

 // execute the action
 $data->execute();
}

तब आप उपयोगकर्ता को होम पेज पर पुनर्निर्देशित कर सकते हैं।

header('LOCATION:' . $home_page);

उम्मीद है कि यह किसी की मदद करेगा :)

धन्यवाद


यह किसी की अच्छी तरह से मदद कर सकता है ... हालांकि PHP की तरह दिखता है, मुझे नहीं लगता कि यह जरूरी सवाल के दायरे के भीतर है :)
टॉम बुश
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.