গ্রুপ অনুসারে এন ফলাফল পেতে গ্রুপের মধ্যে সীমাবদ্ধ ব্যবহার করছেন?


385

নিম্নলিখিত কোয়েরি:

SELECT
year, id, rate
FROM h
WHERE year BETWEEN 2000 AND 2009
AND id IN (SELECT rid FROM table2)
GROUP BY id, year
ORDER BY id, rate DESC

উৎপাদনের:

year    id  rate
2006    p01 8
2003    p01 7.4
2008    p01 6.8
2001    p01 5.9
2007    p01 5.3
2009    p01 4.4
2002    p01 3.9
2004    p01 3.5
2005    p01 2.1
2000    p01 0.8
2001    p02 12.5
2004    p02 12.4
2002    p02 12.2
2003    p02 10.3
2000    p02 8.7
2006    p02 4.6
2007    p02 3.3

আমি যা চাই তা প্রতিটি আইডির জন্য শীর্ষ 5 ফলাফল:

2006    p01 8
2003    p01 7.4
2008    p01 6.8
2001    p01 5.9
2007    p01 5.3
2001    p02 12.5
2004    p02 12.4
2002    p02 12.2
2003    p02 10.3
2000    p02 8.7

সংস্থার মতো কিছু ধরণের LIMIT ব্যবহার করে এটি করার কোনও উপায় আছে যা গ্রুপের মাধ্যমে কাজ করে?


10
এটি মাইএসকিউএল-এ করা যেতে পারে, তবে এটি একটি LIMITধারা যোগ করার মতো সহজ নয় । এখানে একটি নিবন্ধ যা সমস্যাটি বিস্তারিতভাবে ব্যাখ্যা করেছে: এসকিউএল-তে গ্রুপ অনুযায়ী প্রথম / সর্বনিম্ন / সর্বাধিক সারিটি কীভাবে নির্বাচন করবেন এটি একটি ভাল নিবন্ধ - তিনি "গ্রুপ প্রতি প্রতি শীর্ষ এন" সমস্যার একটি মার্জিত তবে নির্লজ্জ সমাধানের পরিচয় দেন এবং তারপরে ধীরে ধীরে এটিতে উন্নতি করে।
danben

নির্বাচন করুন * এর (নির্বাচন করুন বছর, আইডি, হার থেকে বছর যেখানে 2000 এবং ২০০৯ সালের মধ্যে এবং আইডি ইন (টেবিলের 2 টি থেকে রেড নির্বাচন করুন) আইডি অনুসারে গ্রেড, আইডি দ্বারা বছরের অর্ডার, রেট ডিইএসসি) লিমিটেড 5
মিক্সক্যাটল

উত্তর:


115

আপনি একক কলামে গোষ্ঠীভুক্ত ও ক্রমবর্ধমানভাবে সমস্ত বছর পেতে GROUP_CONCAT সম্মিলিত ফাংশনটি ব্যবহার করতে পারেন :idrate

SELECT   id, GROUP_CONCAT(year ORDER BY rate DESC) grouped_year
FROM     yourtable
GROUP BY id

ফলাফল:

-----------------------------------------------------------
|  ID | GROUPED_YEAR                                      |
-----------------------------------------------------------
| p01 | 2006,2003,2008,2001,2007,2009,2002,2004,2005,2000 |
| p02 | 2001,2004,2002,2003,2000,2006,2007                |
-----------------------------------------------------------

এবং তারপরে আপনি FIND_IN_SET ব্যবহার করতে পারেন , এটি দ্বিতীয়টির ভিতরে প্রথম যুক্তির অবস্থান প্রদান করে, যেমন।

SELECT FIND_IN_SET('2006', '2006,2003,2008,2001,2007,2009,2002,2004,2005,2000');
1

SELECT FIND_IN_SET('2009', '2006,2003,2008,2001,2007,2009,2002,2004,2005,2000');
6

GROUP_CONCATএবং এর সংমিশ্রণটি ব্যবহার করে FIND_IN_SETএবং Find_in_set দ্বারা ফিরে অবস্থানে ফিল্টারিং করে আপনি এই ক্যোয়ারীটি ব্যবহার করতে পারেন যা প্রতিটি আইডির জন্য প্রথম 5 বছরে ফিরে আসে:

SELECT
  yourtable.*
FROM
  yourtable INNER JOIN (
    SELECT
      id,
      GROUP_CONCAT(year ORDER BY rate DESC) grouped_year
    FROM
      yourtable
    GROUP BY id) group_max
  ON yourtable.id = group_max.id
     AND FIND_IN_SET(year, grouped_year) BETWEEN 1 AND 5
ORDER BY
  yourtable.id, yourtable.year DESC;

অনুগ্রহপূর্বক এখানে দেখুন

দয়া করে নোট করুন যে একাধিক সারির যদি একই হার থাকতে পারে তবে আপনি বছরের কলামের পরিবর্তে হার কলামে GROUP_CONCAT (DISTINCT হার অর্ডার বাই রেট) ব্যবহার করা উচিত।

GROUP_CONCAT দ্বারা ফিরে আসা স্ট্রিংয়ের সর্বাধিক দৈর্ঘ্য সীমাবদ্ধ, সুতরাং আপনার প্রতিটি গ্রুপের জন্য কয়েকটি রেকর্ড নির্বাচন করার প্রয়োজন হলে এটি ভাল কাজ করে।


3
এটি সুন্দরভাবে পারফরম্যান্ট, তুলনামূলক সহজ এবং দুর্দান্ত ব্যাখ্যা; তোমাকে অনেক ধন্যবাদ. আপনার শেষ পয়েন্টে, যেখানে যুক্তিসঙ্গত সর্বাধিক দৈর্ঘ্য গণনা করা যেতে পারে, SET SESSION group_concat_max_len = <maximum length>;ওপি'র ক্ষেত্রে একটি ব্যবহার করতে পারে , একটি নন-ইস্যু (যেহেতু ডিফল্টটি 1024 হয়) তবে উদাহরণস্বরূপ, গ্রুপ_কনক্যাট_ম্যাক্স_লেন কমপক্ষে 25: 4 হওয়া উচিত (সর্বোচ্চ এক বছরের স্ট্রিংয়ের দৈর্ঘ্য) + 1 (বিভাজক চরিত্র), 5 বার (প্রথম 5 বছর)। স্ট্রিংগুলি ত্রুটি ছুঁড়ে ফেলার পরিবর্তে কেটে ফেলা হয়, সুতরাং সতর্কতা যেমন দেখুন 1054 rows in set, 789 warnings (0.31 sec)
টিমোথি জনস

যদি আমি কী ব্যবহার করব তার চেয়ে 1 থেকে 5 এর চেয়ে সঠিক 2 সারি আনতে চাই FIND_IN_SET()। আমি চেষ্টা করেছি FIND_IN_SET() =2তবে আশানুরূপ ফল প্রদর্শন করছি না।
আমোগ

আকার 5 এর সমান বা তার চেয়ে বড় হলে GIUP_CONCAT এর প্রথম 5 অবস্থানগুলিতে FIND_IN_SET এ 5 এবং 5 টি গ্রহণ করবে তাই FIND_IN_SET = 2 আপনার GROUP_CONCAT এ 2 য় অবস্থানের সাথে কেবল ডেটা নেবে। 2 টি সারি পেয়ে আপনি 1 ম এবং 2 তম অবস্থানের জন্য 2 এবং 2 টি সারি রয়েছে বলে ধরে নিতে 2 এর মধ্যে নীচে চেষ্টা করতে পারেন।
jDub9

বড় ডেটাসেটের জন্য সালমানের চেয়ে এই সমাধানটির তুলনায় অনেক ভাল পারফরম্যান্স রয়েছে। যাইহোক যাইহোক যেমন চালাক সমাধানের জন্য আমি উভয়কে থাম্ব দিয়েছি। ধন্যবাদ !!
tiomno

105

মূল ক্যোয়ারী ব্যবহারকারী ভেরিয়েবল এবং ব্যবহৃত ORDER BYউদ্ভূত টেবিলের উপর; উভয় quirks আচরণ গ্যারান্টিযুক্ত হয় না। নিম্নরূপ সংশোধিত উত্তর।

মাইএসকিউএল ৫.x এ আপনি কাঙ্ক্ষিত ফলাফল অর্জনের জন্য পার্টিশনের চেয়ে দরিদ্র ব্যক্তির র‌্যাঙ্ক ব্যবহার করতে পারেন। নিজের সাথে এবং প্রতিটি সারির জন্য কেবল বাইরের অংশটি টেবিলে যোগ দিন, এর চেয়ে কম সারির সংখ্যা গণনা করুন । উপরের ক্ষেত্রে, কম সারি উচ্চতর হারের সাথে এক:

SELECT t.id, t.rate, t.year, COUNT(l.rate) AS rank
FROM t
LEFT JOIN t AS l ON t.id = l.id AND t.rate < l.rate
GROUP BY t.id, t.rate, t.year
HAVING COUNT(l.rate) < 5
ORDER BY t.id, t.rate DESC, t.year

ডেমো এবং ফলাফল :

| id  | rate | year | rank |
|-----|------|------|------|
| p01 |  8.0 | 2006 | 0    |
| p01 |  7.4 | 2003 | 1    |
| p01 |  6.8 | 2008 | 2    |
| p01 |  5.9 | 2001 | 3    |
| p01 |  5.3 | 2007 | 4    |
| p02 | 12.5 | 2001 | 0    |
| p02 | 12.4 | 2004 | 1    |
| p02 | 12.2 | 2002 | 2    |
| p02 | 10.3 | 2003 | 3    |
| p02 |  8.7 | 2000 | 4    |

মনে রাখবেন যে হারগুলির যদি সম্পর্ক থাকে তবে উদাহরণস্বরূপ:

100, 90, 90, 80, 80, 80, 70, 60, 50, 40, ...

উপরের জিজ্ঞাসাটি 6 টি সারি ফিরিয়ে দেবে:

100, 90, 90, 80, 80, 80

HAVING COUNT(DISTINCT l.rate) < 58 টি সারি পেতে পরিবর্তন করুন :

100, 90, 90, 80, 80, 80, 70, 60

বা ON t.id = l.id AND (t.rate < l.rate OR (t.rate = l.rate AND t.pri_key > l.pri_key))5 টি সারি পেতে পরিবর্তন করুন :

 100, 90, 90, 80, 80

মাইএসকিউএল 8 বা পরবর্তী সময়ে কেবলমাত্র RANK, DENSE_RANKবাROW_NUMBER ফাংশনগুলি ব্যবহার করুন :

SELECT *
FROM (
    SELECT *, RANK() OVER (PARTITION BY id ORDER BY rate DESC) AS rnk
    FROM t
) AS x
WHERE rnk <= 5

7
আমি মনে করি এটি উল্লেখযোগ্য যে মূল অংশটি আইডি দ্বারা অর্ডার করা হয় যেহেতু আইডির মানের কোনও পরিবর্তন র‌্যাঙ্কে পুনরায় গণনা আরম্ভ করবে।
রুটার

এর প্রতিক্রিয়া পেতে কেন আমি এটিকে দু'বার চালাব WHERE rank <=5? আমি প্রথমবারের মতো প্রতিটি আইডি থেকে 5 টি সারি পাচ্ছি না, তবে আপনি যা বলেছেন তার পরে আমি তা পেতে সক্ষম হয়েছি।
ব্রেন্নো লিয়াল

@ ব্রেনোলেল আমার ধারণা আপনি SETবিবৃতিটি ভুলে যাচ্ছেন (প্রথম ক্যোয়ারী দেখুন)। এটা জরুরি.
সালমান এ

3
নতুন সংস্করণগুলিতে, ORDER BYউত্পন্ন টেবিলের মধ্যে থাকা এবং প্রায়শই এড়ানো হবে। এটি লক্ষ্যকে পরাস্ত করে। দক্ষ দলভিত্তিক এখানে পাওয়া যায় ।
রিক জেমস

1
+1 আপনার উত্তর পুনরায় লেখার বিষয়টি খুব বৈধ, কারণ আধুনিক মাইএসকিউএল / মারিয়াডিবি সংস্করণগুলি এএনএসআই / আইএসও এসকিউএল 1992/1999/2003 মানকে আরও অনুসরণ করে যেখানে এটি কখনও ORDER BYসরবরাহ করা / সাবকোয়ারিতে সত্যই ব্যবহার করার অনুমতি পায়নি .. এ কারণেই আধুনিক মাইএসকিউএল / মারিয়াডিবি সংস্করণগুলি ORDER BYসাবকিউরিটি ব্যবহার না করেই উপেক্ষা করে LIMIT, আমি বিশ্বাস করি যে এএনএসআই / আইএসও এসকিউএল স্ট্যান্ডার্ডস ২০০৮/২০১২/২০১ ORDER BYwith এর সাথে সম্মিলিতভাবে ব্যবহার করার সময় বিতরণ / সাবকিউরিগুলিকে আইনী করে তোলেFETCH FIRST n ROWS ONLY
রায়মন্ড নিজল্যান্ড ২৮:০৫ এ

21

আমার জন্য কিছু

SUBSTRING_INDEX(group_concat(col_name order by desired_col_order_name), ',', N) 

পুরোপুরি কাজ করে। কোনও জটিল কোয়েরি নেই।


উদাহরণস্বরূপ: প্রতিটি গ্রুপের জন্য শীর্ষস্থানীয় 1 পান

SELECT 
    *
FROM
    yourtable
WHERE
    id IN (SELECT 
            SUBSTRING_INDEX(GROUP_CONCAT(id
                            ORDER BY rate DESC),
                        ',',
                        1) id
        FROM
            yourtable
        GROUP BY year)
ORDER BY rate DESC;

আপনার সমাধানটি পুরোপুরি কার্যকর হয়েছিল, তবে আমি সাবকোয়ারি থেকে বছর এবং অন্যান্য কলামগুলি পুনরুদ্ধার করতে চাই, আমরা কীভাবে এটি করতে পারি?
MaNn

9

না, আপনি নির্বিচারে সাবকিউরিসগুলি সীমাবদ্ধ করতে পারবেন না (আপনি এটি নতুন মাইএসকিউএলসগুলিতে সীমাবদ্ধ পরিমাণে করতে পারেন, তবে প্রতি গ্রুপে 5 ফলাফলের জন্য নয়)।

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

এই সমস্যার সর্বাধিক সমাধানের মতো, একই rateমান সহ একাধিক সারি থাকলে এটি পাঁচটি সারিও বেশি ফিরতে পারে, সুতরাং এটির জন্য আপনাকে এখনও বেশ কয়েকটি পোস্ট-প্রসেসিং প্রয়োজন হতে পারে।


9

মানগুলি র‌্যাঙ্ক করতে, এগুলি সীমাবদ্ধ করার জন্য, তারপর গোষ্ঠীকরণের সময় যোগফল সম্পাদন করতে এগুলির জন্য একাধিক সাবকিউয়ের প্রয়োজন

@Rnk:=0;
@N:=2;
select
  c.id,
  sum(c.val)
from (
select
  b.id,
  b.bal
from (
select   
  if(@last_id=id,@Rnk+1,1) as Rnk,
  a.id,
  a.val,
  @last_id=id,
from (   
select 
  id,
  val 
from list
order by id,val desc) as a) as b
where b.rnk < @N) as c
group by c.id;

9

এটা চেষ্টা কর:

SELECT h.year, h.id, h.rate 
FROM (SELECT h.year, h.id, h.rate, IF(@lastid = (@lastid:=h.id), @index:=@index+1, @index:=0) indx 
      FROM (SELECT h.year, h.id, h.rate 
            FROM h
            WHERE h.year BETWEEN 2000 AND 2009 AND id IN (SELECT rid FROM table2)
            GROUP BY id, h.year
            ORDER BY id, rate DESC
            ) h, (SELECT @lastid:='', @index:=0) AS a
    ) h 
WHERE h.indx <= 5;

1
মাঠের তালিকায় অজানা কলাম a.type
আনু

5
SELECT year, id, rate
FROM (SELECT
  year, id, rate, row_number() over (partition by id order by rate DESC)
  FROM h
  WHERE year BETWEEN 2000 AND 2009
  AND id IN (SELECT rid FROM table2)
  GROUP BY id, year
  ORDER BY id, rate DESC) as subquery
WHERE row_number <= 5

সাবকিউরিটি আপনার প্রশ্নের প্রায় একইরকম। কেবল পরিবর্তন যুক্ত হচ্ছে

row_number() over (partition by id order by rate DESC)

8
এটি দুর্দান্ত তবে মাইএসকিউএলের কোনও উইন্ডো ফাংশন নেই (যেমন ROW_NUMBER())।
ypercubeᵀᴹ

3
মাইএসকিউএল 8.0 পর্যন্ত row_number()হয় প্রাপ্তিসাধ্য
এরিক ২

4

ভার্চুয়াল কলামগুলি যেমন - ওরাকলে রাউআইডি-তে তৈরি করুন

টেবিল:

`
CREATE TABLE `stack` 
(`year` int(11) DEFAULT NULL,
`id` varchar(10) DEFAULT NULL,
`rate` float DEFAULT NULL) 
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
`

ডেটা:

insert into stack values(2006,'p01',8);
insert into stack values(2001,'p01',5.9);
insert into stack values(2007,'p01',5.3);
insert into stack values(2009,'p01',4.4);
insert into stack values(2001,'p02',12.5);
insert into stack values(2004,'p02',12.4);
insert into stack values(2005,'p01',2.1);
insert into stack values(2000,'p01',0.8);
insert into stack values(2002,'p02',12.2);
insert into stack values(2002,'p01',3.9);
insert into stack values(2004,'p01',3.5);
insert into stack values(2003,'p02',10.3);
insert into stack values(2000,'p02',8.7);
insert into stack values(2006,'p02',4.6);
insert into stack values(2007,'p02',3.3);
insert into stack values(2003,'p01',7.4);
insert into stack values(2008,'p01',6.8);

এসকিউএল এর মত:

select t3.year,t3.id,t3.rate 
from (select t1.*, (select count(*) from stack t2 where t1.rate<=t2.rate and t1.id=t2.id) as rownum from stack t1) t3 
where rownum <=3 order by id,rate DESC;

t3-তে যেখানে ক্লজটি মুছে ফেললে তা এটির মতো দেখায়:

এখানে চিত্র বর্ণনা লিখুন

"টপ এন রেকর্ড" পান - যেখানে ক্লজ (টি -3-এর ক্লজ) যেখানে "রোউনাম <= 3" যুক্ত করুন;

"বছরটি" বেছে নিন -> যেখানে ক্লজ (টি -3-এর ক্লজ) যেখানে "বিটওয়াইন 2000 এবং ২০০৯" যুক্ত করুন;


যদি আপনার কাছে একই আইডির পুনরাবৃত্তি হার হয় তবে তা কার্যকর হবে না কারণ আপনার সারি সংখ্যাটি আরও বাড়বে; আপনি প্রতি সারিতে 3 পাবেন না, আপনি 0, 1 বা 2 পেতে পারেন you আপনি এর কোনও সমাধান সম্পর্কে ভাবতে পারেন?
স্টারভেটার

@ স্টারভেটরটি "t1.rate <= t2.rate" কে "t1.rate <t2.rate" এ পরিবর্তন করুন, যদি সেরা আইডিতে একই হারের মান হয় তবে তাদের সকলেরই একই ডাল রয়েছে তবে উচ্চতর বাড়বে না; "আইডি p01 এ 8 রেট" এর মতো, যদি এটি পুনরাবৃত্তি করে, "t1.rate <t2.rate" ব্যবহার করে, "আইডি p01 এ 8 রেট" উভয়ই একই রোভনাম 0 রয়েছে; যদি "t1.rate <= t2.rate" ব্যবহার করে, রোউনাম 2 হয়;
ওয়াং ওয়েন'ান

3

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

SELECT h.year, h.id, h.rate 
  FROM (
    SELECT id, 
      SUBSTRING_INDEX(GROUP_CONCAT(CONCAT(id, '-', year) ORDER BY rate DESC), ',' , 5) AS l
      FROM h
      WHERE year BETWEEN 2000 AND 2009
      GROUP BY id
      ORDER BY id
  ) AS h_temp
    LEFT JOIN h ON h.id = h_temp.id 
      AND SUBSTRING_INDEX(h_temp.l, CONCAT(h.id, '-', h.year), 1) != h_temp.l

নোট করুন যে এই উদাহরণটি প্রশ্নের প্রয়োজনে নির্দিষ্ট করা হয়েছে এবং অন্যান্য অনুরূপ উদ্দেশ্যে খুব সহজেই পরিবর্তন করা যেতে পারে।


2

নিম্নলিখিত পোস্ট: বর্গফুট: বিক্রয় প্রতি শীর্ষ এন রেকর্ড subqueries ছাড়াই এটি অর্জন জটিল উপায় বর্ণনা করে।

এটি এখানে প্রদত্ত অন্যান্য সমাধানগুলিতে উন্নতি করে:

  • একক ক্যোয়ারিতে সবকিছু করা
  • সূচকগুলি যথাযথভাবে ব্যবহার করতে সক্ষম হওয়া
  • সাবকিউরিগুলি এড়িয়ে যাওয়া, মাইএসকিউএলে খারাপ সম্পাদন পরিকল্পনা তৈরি করার জন্য কুখ্যাত known

এটি যদিও সুন্দর নয়। উইন্ডো ফাংশনগুলি (ওরফে অ্যানালিটিক ফাংশন) মাইএসকিউএলে সক্ষম হওয়া একটি ভাল সমাধান অর্জনযোগ্য হবে - তবে সেগুলি তা নয়। উল্লিখিত পোস্টে ব্যবহৃত কৌশলটি GROUP_CONCAT ব্যবহার করে, যা কখনও কখনও "MySQL এর জন্য দরিদ্র ব্যক্তির উইন্ডো ফাংশন" হিসাবে বর্ণনা করা হয় described


1

আমার মত যারা জিজ্ঞাসা সময় ছিল। আমি নির্দিষ্ট গ্রুপ দ্বারা সীমা এবং অন্য যে কোনও কিছু ব্যবহারের জন্য নীচে তৈরি করেছি।

DELIMITER $$
CREATE PROCEDURE count_limit200()
BEGIN
    DECLARE a INT Default 0;
    DECLARE stop_loop INT Default 0;
    DECLARE domain_val VARCHAR(250);
    DECLARE domain_list CURSOR FOR SELECT DISTINCT domain FROM db.one;

    OPEN domain_list;

    SELECT COUNT(DISTINCT(domain)) INTO stop_loop 
    FROM db.one;
    -- BEGIN LOOP
    loop_thru_domains: LOOP
        FETCH domain_list INTO domain_val;
        SET a=a+1;

        INSERT INTO db.two(book,artist,title,title_count,last_updated) 
        SELECT * FROM 
        (
            SELECT book,artist,title,COUNT(ObjectKey) AS titleCount, NOW() 
            FROM db.one 
            WHERE book = domain_val
            GROUP BY artist,title
            ORDER BY book,titleCount DESC
            LIMIT 200
        ) a ON DUPLICATE KEY UPDATE title_count = titleCount, last_updated = NOW();

        IF a = stop_loop THEN
            LEAVE loop_thru_domain;
        END IF;
    END LOOP loop_thru_domain;
END $$

এটি ডোমেনের তালিকার মধ্য দিয়ে যায় এবং তারপরে প্রতিটি মাত্র 200 এর সীমা সন্নিবেশ করে


1

এটা চেষ্টা কর:

SET @num := 0, @type := '';
SELECT `year`, `id`, `rate`,
    @num := if(@type = `id`, @num + 1, 1) AS `row_number`,
    @type := `id` AS `dummy`
FROM (
    SELECT *
    FROM `h`
    WHERE (
        `year` BETWEEN '2000' AND '2009'
        AND `id` IN (SELECT `rid` FROM `table2`) AS `temp_rid`
    )
    ORDER BY `id`
) AS `temph`
GROUP BY `year`, `id`, `rate`
HAVING `row_number`<='5'
ORDER BY `id`, `rate DESC;

0

সঞ্চিত প্রক্রিয়া নীচে চেষ্টা করুন। আমি ইতিমধ্যে যাচাই করেছি। আমি সঠিক ফলাফল পাচ্ছি কিন্তু ব্যবহার না করেই groupby

CREATE DEFINER=`ks_root`@`%` PROCEDURE `first_five_record_per_id`()
BEGIN
DECLARE query_string text;
DECLARE datasource1 varchar(24);
DECLARE done INT DEFAULT 0;
DECLARE tenants varchar(50);
DECLARE cur1 CURSOR FOR SELECT rid FROM demo1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    SET @query_string='';

      OPEN cur1;
      read_loop: LOOP

      FETCH cur1 INTO tenants ;

      IF done THEN
        LEAVE read_loop;
      END IF;

      SET @datasource1 = tenants;
      SET @query_string = concat(@query_string,'(select * from demo  where `id` = ''',@datasource1,''' order by rate desc LIMIT 5) UNION ALL ');

       END LOOP; 
      close cur1;

    SET @query_string  = TRIM(TRAILING 'UNION ALL' FROM TRIM(@query_string));  
  select @query_string;
PREPARE stmt FROM @query_string;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

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