মাইএসকিউএল অন্য কলামগুলির সাথে সংশ্লিষ্ট একটি কলাম DISTINCT নির্বাচন করে


192
ID   FirstName   LastName
1      John        Doe
2      Bugs        Bunny
3      John        Johnson

আমি নির্বাচন করতে চান DISTINCTথেকে ফলাফল FirstNameকলাম, কিন্তু আমি সংশ্লিষ্ট প্রয়োজন IDএবং LastName

ফলাফল সেটটিতে কেবল একটি দেখানো দরকার John, তবে ID1 এবং 2 এর একটি LastNameসহ।


1
আপনি স্বতন্ত্র প্রথম নামের সাথে সর্বনিম্ন আইডির শেষ নামটি চান?
টমাস ল্যাংস্টন

3
শীর্ষটি বাছাইয়ের ক্ষেত্রে যুক্তি কী হওয়া উচিত? আমি মনে করি আপনি উভয় জন ড এবং জন জনসনকে দেখাতে চাইবেন কারণ তারা দুটি স্বতন্ত্র জনসন তবে এটি কেবল আমার পক্ষে।
জুলদা

4
DISTINCTকোন কাজ নয়। সহ সমস্ত উত্তর DISTINCT()ভুল। আপনি পরে এটি না রাখলে ত্রুটিটি প্রদর্শিত হবে SELECT
প্রশ্ন ওভারফ্লো

1
ALL পৃথক শব্দের পরে বন্ধনী ব্যবহারের উত্তরগুলি সত্যই ভুল। স্বতন্ত্রতা কোনও ফাংশন নয় তাই এটি কোনও পরামিতি গ্রহণ করতে পারে না। স্বতন্ত্রভাবে অনুসরণ করা প্রথম বন্ধনীগুলি কেবল উপেক্ষা করা হবে। আপনি পোস্টগ্রাইএসকিউএল ব্যবহার না করা হলে যেখানে প্রথম বন্ধনীগুলি একটি "জটিল ডেটা টাইপ" গঠন করবে
ব্যবহৃত_বাই_আলডিয়ার

উত্তর:


192

এই জিজ্ঞাসা চেষ্টা করুন

 SELECT ID, FirstName, LastName FROM table GROUP BY(FirstName)

15
আমরা কীভাবে জানব যে কোন সারিটি ফিরে আসবে?
উইলিয়াম এন্টারিকেন

26
@ ফুল ডিসেন্ট আপনি পারবেন না, মাইএসকিউএল ডকুমেন্টেশন অনুসারে : "সার্ভার প্রতিটি গ্রুপ থেকে যে কোনও মান বেছে নিতে পারে, তাই তারা যদি একই হয় না, তবে বেছে নেওয়া মানগুলি অনির্দিষ্ট হয়।" অনুশীলনে আমি ধারা দ্বারা অর্ডার দিয়ে এই ধরণের প্রশ্নগুলি সফলভাবে ব্যবহার করেছি, উদাহরণস্বরূপ আপনি এএসসি / ডিইএসসি দ্বারা অর্ডার যুক্ত করতে পারেন এবং মাইএসকিউএল যতবার অনুসন্ধান চালিয়ে যাবেন ততবার ধারাবাহিক ফলাফল ফিরিয়ে আনবেন। তবে আমি নিশ্চিত হয়ে উঠব যে কারও উত্পাদনের পরিবেশে অননুমোদিত বৈশিষ্ট্য ব্যবহার করা উচিত।
অরুণাস জুনেভিচিয়াস

2
ওপি মাইএসকিএল সংস্করণ উল্লেখ করে না।
diEcho

2
@ সিনাজা 5.7.5+পরিবর্তিত GROUP BYহ্যান্ডলিংয়ের
fyrye

3
এটি কেবল_ফুল_গ্রুপ_ মোডের সাথে কাজ করে না কারণ আইডি বা লাস্টনাম দুটিই সম্মিলিত বা গোষ্ঠী ফাংশনের অংশ নয়। সাহায্য করুন!
ইহোডোনাল্ড

63

DISTINCTশব্দ সত্যিই আপনি এটা আশা করছি কাজ করে না। আপনি ব্যবহার করার সময় আপনি SELECT DISTINCT col1, col2, col3সমস্ত অনন্য {কল 1, কল 2, কল 3} টিপল নির্বাচন করছেন select


14
ব্রায়ানকে এটি দেখানোর জন্য ধন্যবাদ। একই ফলাফল পেতে আমি কীভাবে গ্রুপকে কাজে লাগাতে পারি তার একটি উদাহরণ সরবরাহ করতে পারেন?
মিঃ

59

GROUP BYসম্মিলিত ফাংশন ছাড়াই ব্যবহার করার সময় সম্ভাব্য অপ্রত্যাশিত ফলাফল এড়াতে , যেমন গৃহীত উত্তরে ব্যবহৃত হয় , কারণ মাইএসকিউএল একটি গোষ্ঠী ফাংশন [সিক] ব্যবহার না করে এবং গোটা বিষয়গুলি ব্যবহার না করার সময় গোষ্ঠীভুক্ত ডেটা সেটের মধ্যে কোনও মান পুনরুদ্ধার করতে মুক্ত । একটি বর্ধিত যোগদান ব্যবহার করে দয়া করে বিবেচনা করুন।ONLY_FULL_GROUP_BY

বর্জন যোগ দিন - দ্ব্যর্থহীন সত্তা

ধরে নিলাম প্রথম নাম এবং পদবি অনন্যতরভাবে সূচকযুক্ত (দ্ব্যর্থহীন) , এর বিকল্পটি GROUP BYহ'ল LEFT JOINফল সেট ফিল্টার করার জন্য একটি ব্যবহার করে বাছাই করা , অন্যথায় বাদ পড়ার নাম হিসাবে পরিচিত O

বিক্ষোভ দেখুন

আরোহী আদেশ (এজেড)

জেড থেকে শেষ নাম দ্বারা অর্ডার করা স্বতন্ত্র প্রথম নামটি পুনরুদ্ধার করতে

প্রশ্ন

SELECT t1.*
FROM table_name AS t1
LEFT JOIN table_name AS t2
ON t1.firstname = t2.firstname
AND t1.lastname > t2.lastname
WHERE t2.id IS NULL;

ফলাফল

| id | firstname | lastname |
|----|-----------|----------|
|  2 |      Bugs |    Bunny |
|  1 |      John |      Doe |

অবতরণ আদেশ (জেডএ)

জেডএ থেকে শেষ নাম দ্বারা অর্ডার করা স্বতন্ত্র প্রথম নামটি পুনরুদ্ধার করতে

প্রশ্ন

SELECT t1.*
FROM table_name AS t1
LEFT JOIN table_name AS t2
ON t1.firstname = t2.firstname
AND t1.lastname < t2.lastname
WHERE t2.id IS NULL;

ফলাফল

| id | firstname | lastname |
|----|-----------|----------|
|  2 |      Bugs |    Bunny |
|  3 |      John |  Johnson |

তারপরে আপনি ফলাফল হিসাবে পছন্দসই হিসাবে অর্ডার করতে পারেন।


বর্জন যোগ দিন - দ্ব্যর্থহীন সত্তা

যদি প্রথম এবং শেষ নামের সংমিশ্রণটি অনন্য (অস্পষ্ট) না হয় এবং আপনার একই মানগুলির একাধিক সারি থাকে, আপনি আইডির মাধ্যমে ফিল্টার করার জন্য JOIN মানদণ্ডে একটি OR শর্ত যুক্ত করে ফলাফল নির্ধারণ করতে পারবেন।

বিক্ষোভ দেখুন

টেবিলের নাম ডেটা

(1, 'John', 'Doe'),
(2, 'Bugs', 'Bunny'),
(3, 'John', 'Johnson'),
(4, 'John', 'Doe'),
(5, 'John', 'Johnson')

প্রশ্ন

SELECT t1.*
FROM table_name AS t1
LEFT JOIN table_name AS t2
ON t1.firstname = t2.firstname
AND (t1.lastname > t2.lastname
OR (t1.firstname = t1.firstname AND t1.lastname = t2.lastname AND t1.id > t2.id))
WHERE t2.id IS NULL;

ফলাফল

| id | firstname | lastname |
|----|-----------|----------|
|  1 |      John |      Doe |
|  2 |      Bugs |    Bunny |

আদেশ সাবকিউরি

সম্পাদনা

অর্ডারযুক্ত সাবকোয়ারি ব্যবহার করে আমার মূল উত্তরটি মাইএসকিউএল ৫.7.৫ এর আগে লেখা হয়েছিল , যা পরিবর্তনের কারণে আর প্রযোজ্য নয় ONLY_FULL_GROUP_BY। পরিবর্তে উপরে বর্জন উদাহরণগুলি ব্যবহার করুন।

এটি লক্ষ করাও গুরুত্বপূর্ণ; যখন ONLY_FULL_GROUP_BYঅক্ষম থাকে (মাইএসকিউএল 5.7.5 এর পূর্বে আসল আচরণ) , GROUP BYএকটি সামগ্রিক ফাংশন ছাড়াই ব্যবহার অপ্রত্যাশিত ফলাফল আনতে পারে, কারণ মাইএসকিউএল গোষ্ঠীভুক্ত ডেটা সেটের মধ্যে যে কোনও মান চয়ন করতে পারে [sic]

অর্থ একটি IDবা lastnameমান পুনরুদ্ধার করা যেতে পারে যা পুনরুদ্ধার করা সারির সাথে সম্পর্কিত নয়firstname


সতর্কতামূলক

মাইএসকিউএল সহ GROUP BYব্যবহার করার সময় প্রত্যাশিত ফলাফল নাও পেতে পারেORDER BY

পরীক্ষার কেসের উদাহরণ দেখুন

প্রত্যাশিত ফলাফলগুলি নিশ্চিত করার জন্য বাস্তবায়নের সর্বোত্তম পদ্ধতি হ'ল আদেশযুক্ত সাবকোয়ারি ব্যবহার করে ফলাফল সেট স্কোপ ফিল্টার করা।

টেবিলের নাম ডেটা

(1, 'John', 'Doe'),
(2, 'Bugs', 'Bunny'),
(3, 'John', 'Johnson')

প্রশ্ন

SELECT * FROM (
    SELECT * FROM table_name ORDER BY ID DESC
) AS t1
GROUP BY FirstName

ফলাফল

| ID | first |    last |
|----|-------|---------|
|  2 |  Bugs |   Bunny |
|  3 |  John | Johnson |

তুলনা

GROUP BYসাথে ব্যবহারের সময় অপ্রত্যাশিত ফলাফলগুলি প্রদর্শন করাORDER BY

প্রশ্ন

SELECT * FROM table_name GROUP BY FirstName ORDER BY ID DESC

ফলাফল

| ID | first |  last |
|----|-------|-------|
|  2 |  Bugs | Bunny |
|  1 |  John |   Doe |

3
এখন পর্যন্ত সবচেয়ে সম্পূর্ণ উত্তর। প্রথম ক্যোয়ারিতে 'আইডি ডেস্ক' 'আইডি এসসি' তে পরিবর্তন করা আমাদের 'জন দো' বা 'জন জনসন' কে পুনরুদ্ধার করার অনুমতি দেয়। দ্বিতীয় ক্যোয়ারিতে 'আইডি ডেস্ক' পরিবর্তন করলে এর প্রভাব নেই।
কারলা

পোস্টগ্রাগুলিতে আপনাকে মাইএসকিএল নিশ্চিত না করে গ্রুপে আইডি লাগবে।
শচীন প্রসাদ

কোনও নির্বাচনী বিবৃতিতে কলাম-এ অর্ডার দ্বারা একটি গ্রুপ গ্রাহক সর্বদা মরিয়াডিবি'র সর্বশেষ সংস্করণটির সাথে সঠিকভাবে কাজ করবে?
নিল ডেভিস

প্রতি @NealDavis হিসাবে MariaDB ম্যানুয়াল Ordering is done after grouping., তাই কোনও এই ব্যবহার-ক্ষেত্রে, ছাড়াও MariaDB উপেক্ষা করে আদেশ দ্বারা subqueries মধ্যে (এসকিউএল মান অনুযায়ী) একটি ছাড়া LIMIT। আপনি Window Functionআরও স্পষ্টতার জন্য একটি ডিবিএ স্ট্যাকেক্সচেঞ্জে আপনার প্রশ্ন জিজ্ঞাসা করা উচিত , কারণ এটি মাইএসকিউএল সম্পর্কিত একটি প্রশ্ন
ফাইরি

1
@ নাটস নং, গ্রুপযুক্ত GROUP BYডেটা সেটের মধ্যে যে কোনও মান নির্বাচন করতে পারে, যদি না নির্দিষ্ট স্তরের উপর চাপ দেওয়ার জন্য এই কলামগুলিতে একটি সামগ্রিক ফাংশন ব্যবহার করা হয়। সুতরাং lastnameবা idঅর্ডার করা সারিগুলির যে কোনও থেকে আসতে পারে। মূল subquery উদাহরণ ডিফল্ট হিসাবে গ্রহণযোগ্য ছিল MySQL <= 5.7.4কিন্তু প্রযুক্তিগতভাবে এখনও সমস্যাটি ভোগ করে। যদিও ORDER BYএলোমেলো নির্বাচন প্রতিরোধ করতে সহায়তা করে, তবুও এটি তাত্ত্বিকভাবে সম্ভব, তবে ORDER BYসাবকিউরি ব্যবহার না করে উল্লেখযোগ্যভাবে কম সম্ভাবনার সাথে ।
fyrye



3

কেমন

`SELECT 
    my_distinct_column,
    max(col1),
    max(col2),
    max(col3)
    ...
 FROM
    my_table 
 GROUP BY 
    my_distinct_column`

2

আপনি মাইএসকিউএল দিয়ে এটি করতে পারবেন কিনা তা নিশ্চিত নন, তবে আপনি টি-এসকিউএল-তে কোনও সিটিই ব্যবহার করতে পারেন

; WITH tmpPeople AS (
 SELECT 
   DISTINCT(FirstName),
   MIN(Id)      
 FROM People
)
SELECT
 tP.Id,
 tP.FirstName,
 P.LastName
FROM tmpPeople tP
JOIN People P ON tP.Id = P.Id

অন্যথায় আপনাকে একটি অস্থায়ী টেবিল ব্যবহার করতে হতে পারে।


1

ফাইরি দ্বারা নির্দেশিত হিসাবে , গৃহীত উত্তরটি মাইএসকিউএল এর পুরানো সংস্করণগুলির সাথে সম্পর্কিত যেখানে এতে ONLY_FULL_GROUP_BYএখনও পরিচয় করা হয়নি। মাইএসকিউএল ৮.০.১ ((এই উদাহরণে ব্যবহৃত) সহ, আপনি যদি অক্ষম না করেন তবে আপনি ONLY_FULL_GROUP_BYনিম্নলিখিত ত্রুটি বার্তাটি পাবেন:

mysql> SELECT id, firstName, lastName FROM table_name GROUP BY firstName;

ত্রুটি 1055 (42000): SELECT তালিকার # 1 এক্সপ্রেশনটি গ্রুপের মাধ্যমে গ্রুপে নেই এবং এতে গ্রাগ BY ক্লজের কলামগুলির উপর কার্যত নির্ভরশীল নয় এমন 'ক্রেডিট' mydatedia.table_name.id 'রয়েছে; এটি স্কয়ার_মোড = কেবল_ সম্পূর্ণ_গ্রুপ_বিয়ের সাথে বেমানান

এটিকে ঘিরে কাজ করার একটি উপায় fyrye দ্বারা উল্লিখিত নয় , তবে https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html এ বর্ণিত , ANY_VALUE()কলামগুলিতে ফাংশন প্রয়োগ করা যা নেই GROUP BYদফা ( idএবং lastNameএই উদাহরণে):

mysql> SELECT ANY_VALUE(id) as id, firstName, ANY_VALUE(lastName) as lastName FROM table_name GROUP BY firstName;
+----+-----------+----------+
| id | firstName | lastName |
+----+-----------+----------+
|  1 | John      | Doe      |
|  2 | Bugs      | Bunny    |
+----+-----------+----------+
2 rows in set (0.01 sec)

পূর্বোক্ত দস্তাবেজে যেমন লেখা হয়েছে,

এই ক্ষেত্রে, মাইএসকিউএল প্রতিটি নাম গোষ্ঠীর মধ্যে ঠিকানা মানগুলির অ-নির্ধারিততা উপেক্ষা করে কোয়েরি গ্রহণ করে। আপনি যদি প্রতিটি গ্রুপের জন্য অনাগ্রেগ্রেটেড কলামের কোন মানটি বেছে নেওয়া পছন্দ করেন তবে এটি কার্যকর হতে পারে। বা ANY_VALUE()হিসাবে যেমন ফাংশন থেকে পৃথক, একটি সামগ্রিক ফাংশন নয় । এটি কেবল অ-নির্ধারিততার জন্য পরীক্ষা দমন করার জন্য কাজ করে।SUM()COUNT()


স্পষ্টতার জন্য, আমি ANY_VALUE()আমার উত্তর হিসাবে মন্তব্যগুলি ব্যবহার করার পরামর্শ দেওয়া এড়িয়ে গিয়ে এড়িয়ে গেছি এবং মন্তব্যগুলি অস্পষ্ট এবং অনির্দেশ্য ফলাফল-সেটগুলি রোধ করার দিকে দৃষ্টি নিবদ্ধ করে। যেহেতু ফাংশনটির নামটি পরামর্শ দেয়, ফলস্বরূপ নির্বাচিত সারিগুলির যে কোনও মান পুনরুদ্ধার হতে পারে। আমি ব্যবহার MAXবা MINতার পরিবর্তে পরামর্শ দিতে হবে।
fyrye

0

গোষ্ঠীটি ব্যবহার করার সময় মনে রাখবেন এবং মাইএসকিউএল দ্বারা আদেশ করুন কেবলমাত্র ডাটাবেস যা কলামগুলিকে গ্রুপে এবং / অথবা নির্বাচিত বিবৃতিটির অংশ নয় এমন টুকরো টুকরো অনুসারে ব্যবহার করতে দেয়।

সুতরাং উদাহরণস্বরূপ: কলাম 3 দ্বারা কলাম 2 ক্রমানুসারে সারণী গোষ্ঠী থেকে কলাম 1 নির্বাচন করুন

এটি পোস্টগ্রিস, ওরাকল, এমএসএসকিউএল ইত্যাদির মতো অন্যান্য ডাটাবেসে উড়বে না You ডাটাবেসে আপনাকে নিম্নলিখিতটি করতে হবে

কলাম 3 দ্বারা কলাম 2 ক্রমানুসারে সারণী গোষ্ঠী থেকে কলাম 1, কলাম 2, কলাম 3 নির্বাচন করুন

আপনি যদি আপনার বর্তমান কোডটি অন্য ডেটাবেসে মাইগ্রেট করে থাকেন বা অন্য ডাটাবেসে কাজ শুরু করেন এবং কোডটি পুনরায় ব্যবহার করার চেষ্টা করেন সে ক্ষেত্রে কেবলমাত্র কিছু তথ্য।


-2

আপনি পৃথক মান এবং সংশ্লিষ্ট ক্ষেত্রগুলি প্রদর্শনের জন্য গ্রুপটি ব্যবহার করতে পারেন।

select * from tabel_name group by FirstName

এখন আপনি এইভাবে আউটপুট পেয়েছেন:

ID    FirstName     LastName
2     Bugs          Bunny
1     John          Doe


উত্তর চাইলে লাইক দিন

ID    FirstName     LastName
1     John          Doe
2     Bugs          Bunny

তারপরে এই ক্যোয়ারীটি ব্যবহার করুন,

select * from table_name group by FirstName order by ID

2
অর্ডার দিয়ে গ্রুপিংয়ের সময়
fyrye

-3
SELECT DISTINCT(firstName), ID, LastName from tableName GROUP BY firstName

সেরা বেট আইএমও হতে হবে


32
এটি কার্যকর হবে না, এটি পৃথক মূল্যায়নে আইডি এবং পদবিও নেবে।
লুডো - রেকর্ডটি বন্ধ

2
এটি DISTINCT (প্রথম নাম, আইডি, লাস্টনাম) হিসাবে একই
টম টেলর

-4
SELECT DISTINCT (column1), column2
FROM table1
GROUP BY column1

1
DISTINCT()কোন কাজ নয়। এছাড়াও DISTINCT এবং গ্রুপ একই কাজ করছে, সুতরাং কোনও কারণেই তাদের উভয়কে রাখেনি।
Marki555

এটি একটি কার্যকর বিবৃতি নয়, আপনার DISTINCT বা গ্রুপ উভয়ই ব্যবহার করা উচিত।
হিশানলক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.