দ্বিতীয় সারণীতে সারণী হারিয়ে যাওয়ার জন্য দুটি টেবিলকে কীভাবে যোগ দিতে হবে


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

আপনি চান তালিকার বিপরীতে পেতে আপনার বিদ্যমান ক্যোয়ারীটি ব্যবহার করুন। তারপরে কাঙ্ক্ষিত তালিকাটি পাওয়ার জন্য সেই তালিকাটি নট ইন এর মাধ্যমে চেক করা যাবে।

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

নির্দিষ্ট নির্বাচনের জন্য কোনও ভোট না দেওয়া থাকলে ইউজারআইডি খালি থাকবে, অন্যথায় এটি প্রদর্শিত হবে

আপনি যদি কেবলমাত্র নির্বাচনের তালিকা করতে চান যেখানে কোনও ভোট দেওয়া হয়নি, আপনি এটি এখানে করতে পারেন:

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

5

আপনি যা চাইছেন তা অর্জন করার জন্য অনেকগুলি উপায় রয়েছে। খাঁটি সেট-ভিত্তিক দৃষ্টিভঙ্গি ব্যবহার করা সম্ভবত সবচেয়ে সহজ উপায় straight

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

নির্বাচনের সেট থেকে, ব্যবহারকারীরা যেখানে ভোট দিয়েছেন সেখানে আমরা তাদের সরিয়ে দেই। নির্বাচনের শিরোনাম পেতে নির্বাচনের সাথে যোগ হতে পারে ফলাফল। আপনি নিজের প্রশ্নটি ট্যাগ না করলেও, আপনি মাইএসকিউএল ব্যবহার করছেন বলে বিশ্বাস করার কারণ রয়েছে এবং সেখানে মাইনাস বা এক্সেসপিটি সমর্থিত নয়।

অন্য রূপটি হ'ল 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 এবং উপস্থিতির মধ্যে পৃথক রয়েছে।

অবশেষে, আপনি একটি বাহ্যিক যোগদান ব্যবহার করতে পারেন

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;

যদি ওপেন প্রিকেটিকের সাথে মেলে এমন কোনও সারি নেই, তবে ফলাফল থেকে সমস্ত কলামগুলি নাল দিয়ে প্রতিস্থাপন করা হবে। অতএব, আমরা পরীক্ষা করতে পারি যে ভোটের কোনও কলাম কোথায় বিধিভঙ্গিতে বাতিল আছে। যেহেতু ভোটের উভয় কলামই নালায় থাকতে পারে আপনার সতর্ক হওয়া দরকার।

আদর্শভাবে, আপনার টেবিলগুলি ঠিক করা উচিত যাতে নাল দ্বারা সৃষ্ট গোচাগুলি আপনাকে মোকাবেলা করতে না হয়:

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
যেহেতু গ্রহণযোগ্য উত্তর নির্বাচনগুলি টেনে নিয়েছে যেখানে নির্দিষ্ট ভোটার ভোট দেয়নি, এটি আসলে ওপি-র প্রশ্নের উত্তর দেয় না। এবং, অবশ্যই, এটি যেখানে অন্য কোনও ভোট দেয়নি এমন নির্বাচন পেতে, এটি অন্য উত্তরগুলির মধ্যে একটি মাত্র একটি সামান্য টুইট। এই প্রতিক্রিয়াটির একটি মন্তব্য এটিকে কিছুটা উত্তম উত্তরের মতো মনে হতে পারে। তবুও, ছবি থেকে, একটি বানরের পক্ষে বেশ ভাল! :-)
আরডিফোজz
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.