दूसरी तालिका में गायब पंक्तियों को प्राप्त करने के लिए दो तालिका कैसे जोड़ें


21

के रूप में एक सरल मतदान प्रणाली में

CREATE TABLE elections (
election_id int(11) NOT NULL AUTO_INCREMENT,
title varchar(255),

CREATE TABLE votes (
election_id int(11),
user_id int(11),
FOREIGN KEYs

उपयोगकर्ता द्वारा मतदान करने की सूची प्राप्त करने के लिए, निम्नलिखित JOIN का उपयोग किया जाता है

SELECT * FROM elections
JOIN votes USING(election_id)
WHERE votes.user_id='x'

लेकिन चुनावों की सूची को कैसे प्राप्त करें, जिस पर किसी उपयोगकर्ता ने मतदान नहीं किया है?

जवाबों:


21

इच्छित सूची के विपरीत पाने के लिए अपनी मौजूदा क्वेरी का उपयोग करें। उस सूची को वांछित सूची प्राप्त करने के लिए NOT IN के माध्यम से जांचा जा सकता है।

SELECT * FROM elections WHERE election_id NOT IN (
    SELECT elections.election_id from elections
    JOIN votes USING(election_id)
    WHERE votes.user_id='x'
)

17

बाहरी जुड़ाव का उपयोग करें:

select e.election_id, e.title, v.user_id
from Elections e
 LEFT OUTER JOIN votes v ON v.election_id = e.election_id and v.user_id = @userid

यदि किसी विशेष चुनाव के लिए कोई वोट नहीं मिला है, तो UserId खाली हो जाएगा, अन्यथा यह दिखाई देगा

यदि आप केवल उन चुनावों को सूचीबद्ध करना चाहते हैं जहां कोई वोट नहीं हैं तो आप इसे इस तरह कर सकते हैं:

select *
from elections e
where election_id NOT IN 
 (select election_id
  from votes
  where user_id = @userid
 )

5

आप जो पूछ रहे हैं, उसे हासिल करने के कई तरीके हैं। शायद सबसे सीधा तरीका शुद्ध रूप से सेट-उन्मुख दृष्टिकोण का उपयोग करना है:

select election_id from elections
minus -- except is used instead of minus by some vendors
select election_id from votes where user_id = ?

चुनाव के सेट से, हम उन लोगों को हटा देते हैं जहां उपयोगकर्ता ने मतदान किया है। चुनाव के शीर्षक को प्राप्त करने के लिए परिणाम को चुनावों के साथ जोड़ा जा सकता है। भले ही आपने अपने प्रश्न को टैग नहीं किया हो, लेकिन यह मानने का कारण है कि आप MySQL का उपयोग कर रहे हैं, और MINUS या EXCEPT वहां समर्थित नहीं हैं।

एक अन्य संस्करण NOT EXISTSविधेय का उपयोग करने के लिए है:

select election_id, title 
from elections e
where not exists (
    select 1 
    from votes v
    where e.election_id = v.election_id
      and v.user_id = ?
);

चुनाव, जहां यह उपयोगकर्ता से एक वोट मौजूद नहीं है। NOT INविधेय इसी तरह से इस्तेमाल किया जा सकता। चूंकि इसमें शामिल शून्य हो सकते हैं यह ध्यान देने योग्य है कि शब्दार्थ IN और EXISTS के बीच भिन्न होता है।

अंत में, आप एक बाहरी जुड़ाव का उपयोग कर सकते हैं

select election_id, title 
from elections e
left join votes v
    on e.election_id = v.election_id
   and v.user_id = ?
where v.user_id is null;

यदि कोई पंक्तियाँ नहीं हैं जो ON विधेय से मेल खाती हैं, तो परिणाम से सभी स्तंभों को शून्य से बदल दिया जाता है। इसलिए, हम जांच सकते हैं कि वोट का कोई कॉलम WHERE क्लॉज में शून्य है या नहीं। चूंकि वोटों में दोनों स्तंभ शून्य हो सकते हैं इसलिए आपको सावधान रहने की आवश्यकता है।

आदर्श रूप में, आपको अपनी तालिकाओं को ठीक करना चाहिए, ताकि आपको नल के कारण होने वाले गोच से निपटना न पड़े:

CREATE TABLE elections 
( election_id int NOT NULL AUTO_INCREMENT PRIMARY KEY
, title varchar(255) not null );

CREATE TABLE votes 
( election_id int not null
, user_id int not null
,     constraint pk_votes primary key (election_id, user_id)
,     constraint fk_elections foreign key (election_id)
                              references elections (election_id)
);   

-3
SELECT * 
FROM elections 
WHERE election_id NOT IN (
    SELECT DISTINCT(election_id) from votes
);

4
जैसा कि स्वीकृत उत्तर ने चुनावों को खींचा, जहां एक विशिष्ट मतदाता ने वोट नहीं दिया, यह वास्तव में ओपी के सवाल का जवाब नहीं देता है। और, ज़ाहिर है, यह चुनावों को प्राप्त करने के लिए अन्य जवाबों में से एक का सिर्फ एक मामूली मोड़ है, जहां किसी ने मतदान नहीं किया। उस प्रभाव के लिए एक टिप्पणी यह ​​एक बेहतर जवाब की तरह लग सकता है। फिर भी, चित्र से, एक बंदर के लिए बहुत अच्छा है! :-)
RDFozz
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.