একটি subquery মাধ্যমে একাধিক কলাম নির্বাচন


18

আমি নিম্নলিখিত প্রশ্নের মধ্যে সাবকোয়ারি থেকে 2 টি কলাম নির্বাচন করার চেষ্টা করছি, তবে তা করতে অক্ষম। ওরফে টেবিল তৈরি করার চেষ্টা করা হয়েছিল, কিন্তু এখনও সেগুলি পাওয়া যায়নি।

SELECT
  DISTINCT petid,
  userid,
  (SELECT MAX(comDate) FROM comments WHERE petid=pet.id) AS lastComDate,
  (SELECT userid FROM comments WHERE petid=pet.id ORDER BY id DESC LIMIT 1) AS lastPosterID
FROM 
  pet LEFT JOIN comments ON pet.id = comments.petid
WHERE 
  userid='ABC'      AND 
  deviceID!='ABC'   AND 
  comDate>=DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 2 MONTH);

মূলত, আমি একই সারি থেকে lastComDate& lastPosterIDসারিটি পেতে চেষ্টা করছি - যে সারিটি নির্দিষ্ট পোষা প্রাণীর জন্য মন্তব্যে সর্বশেষতম। দয়া করে পরামর্শ দিন কীভাবে আমি সেগুলি দক্ষ উপায়ে পেতে পারি।

উপরের ক্যোয়ারীটি কাজ করে তবে একই সারিতে দু'বার আনা হওয়ায় ওভারকিল মনে হয়। তদ্ব্যতীত, ORDER BYক্লজটি সামগ্রিক ফাংশনটির তুলনায় উল্লেখযোগ্যভাবে ধীর - যেমনটি কোয়েরি প্রোফাইল করার সময় আমি পেয়েছি। সুতরাং, বাছাই এড়ানো একটি সমাধান প্রশংসা করা হবে।


1
মন্তব্য টেবিলে যদি আপনার একটি সূচক (পেটিড, আইডি) থাকে, তবে আদেশটি সম্ভবত ধীর হবে না, তবে প্রথমে প্রথমে জিনিসগুলি: মনে হচ্ছে আপনার ক্যোয়ারিতে সমস্ত পোষা প্রাণীর জন্য জিজ্ঞাসা করা হচ্ছে যেখানে ইউজারিড 'এবিসি' মন্তব্য করেছেন এগুলি গত দুই মাসের মধ্যে, যেখানে ডিভাইসআইডি 'এবিসি' নয় (যদিও এটি স্পষ্ট নয় যে কোন টেবিলের ডিভাইসটি সম্ভবত কোনও পোষা প্রাণী এবং সম্ভবত মন্তব্যগুলির মধ্যে একটি কলাম) এবং শেষ মন্তব্যকারী কে এবং শেষ মন্তব্যের তারিখ। এটা কি সঠিক?
মাইকেল - স্ক্যালবট

@ মাইকেল-স্ক্লোবট - হ্যাঁ, আমি ঠিক এটি সংগ্রহ করার চেষ্টা করছি। deviceIDথেকে petsটেবিল - যার অর্থ শুধু আমার পোষ্য যা 'এবিসি' নিজে দ্বারা জমা দেওয়া হয় না।
বাফারস্ট্যাক

উত্তর:


13
SELECT DISTINCT petid, userid, lastComDate, lastPosterId
FROM 
    pet 
    LEFT JOIN comments ON pet.id = comments.petid 
    LEFT JOIN (
        SELECT MAX(comDate), userid, petid FROM comments GROUP BY userid
    ) a ON a.petid = pet.id
WHERE 
    userid='ABC' 
    AND deviceID!='ABC' 
    AND comDate>=DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 2 MONTH)
;

যদি রাস্তার নীচে কোথাও কর্মক্ষমতা প্রভাবিত হয় তবে আপনি আপনার সাবকিউরিটি টেম্প টেবিলের বাইরেও টানতে পারেন।


আমি এটিও আগে চেষ্টা করেছি ... এটি NULLউভয়ই lastComDateএবং lastPosterIdসমস্ত রেকর্ডের জন্যই ফিরে আসে ।
বাফারস্ট্যাক

আপনার কাছে কি কোনও নমুনা তথ্য পাওয়া যায়?
ভালকিরি

আমি কীভাবে নমুনা ডেটা সরবরাহ করব?
বাফারস্ট্যাক

: এই পোস্টে নির্দেশ করার চেষ্টা করুন meta.stackexchange.com/questions/156729/...
ভ্যাল্কিরি

1
এটি ভাল, তবে এসকিউএলফিডাল আরও ভাল;)। এখানে একটি উদাহরণ দেখুন । কোড এবং বীজ ডেটা দেখার জন্য আরও ভাল উপায়, কোনও টেবিল নয় যা আপনাকে ফর্ম্যাট করতে হবে।
মেরিয়ান

6

আপনার টেবিলগুলি দেখতে দেখতে এমনটি দেওয়া হয়েছে:

create table pet (id int, userid int, deviceid int);
create table comments (id int, petid int, comdate date);

এই ক্যোয়ারিতে কৌশলটি করা উচিত:

SELECT 
        p.id, 
        p.userid,
        (SELECT MAX(comDate)
         FROM comments
         WHERE petid = p.id
         AND comDate >= DATE_SUB(
                 CURRENT_TIMESTAMP, INTERVAL 2 MONTH)
               ) AS lastComDate,
        (SELECT userid
         FROM comments
         WHERE petid = p.id
         AND comDate >= DATE_SUB(
              CURRENT_TIMESTAMP, INTERVAL 2 MONTH
         ) ORDER BY id DESC LIMIT 1) AS lastPosterID
    FROM 
        pet p

    WHERE 
        p.userid=1
        AND p.deviceID!=1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.