মাইএসকিউএল - নির্বাচন করে সারি নম্বর পান


181

আইটেমগুলি বাছাই করা থাকলে আমি কি একটি নির্বাচনী বিবৃতি চালাতে পারি এবং সারি নম্বরটি পেতে পারি?

আমার এই মত একটি টেবিল আছে:

mysql> describe orders;
+-------------+---------------------+------+-----+---------+----------------+
| Field       | Type                | Null | Key | Default | Extra          |
+-------------+---------------------+------+-----+---------+----------------+
| orderID     | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| itemID      | bigint(20) unsigned | NO   |     | NULL    |                |
+-------------+---------------------+------+-----+---------+----------------+

এরপরে আইডি দ্বারা অর্ডার সংখ্যা পেতে আমি এই ক্যোয়ারীটি চালাতে পারি:

SELECT itemID, COUNT(*) as ordercount
FROM orders
GROUP BY itemID ORDER BY ordercount DESC;

এটি আমাকে এই itemIDজাতীয় টেবিলে প্রত্যেকটির একটি গণনা দেয় :

+--------+------------+
| itemID | ordercount |
+--------+------------+
|    388 |          3 |
|    234 |          2 |
|   3432 |          1 |
|    693 |          1 |
|   3459 |          1 |
+--------+------------+

আমি সারি নম্বরটিও পেতে চাই, তাই আমি বলতে পারি যে itemID=388প্রথম সারিতে 234এটি দ্বিতীয়, ইত্যাদি ( আমি জানি যে আমি জাভাতে এটি করতে পারব যখন ফলাফলটি আবার ফিরে আসবে, তবে আমি ভাবছিলাম যে এসকিউএলকে খাঁটিভাবে এটি পরিচালনা করার কোনও উপায় ছিল কিনা।

হালনাগাদ

র‌্যাঙ্ক নির্ধারণ ফলাফল ফলাফলের সাথে এটি যুক্ত করে, তবে সঠিকভাবে অর্ডার করা হয়নি:

mysql> SET @rank=0;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @rank:=@rank+1 AS rank, itemID, COUNT(*) as ordercount
    -> FROM orders
    -> GROUP BY itemID ORDER BY rank DESC;
+------+--------+------------+
| rank | itemID | ordercount |
+------+--------+------------+
|    5 |   3459 |          1 |
|    4 |    234 |          2 |
|    3 |    693 |          1 |
|    2 |   3432 |          1 |
|    1 |    388 |          3 |
+------+--------+------------+
5 rows in set (0.00 sec)

1
ভবিষ্যতের রেফারেন্সের জন্য: আপনি যদি র‌্যাঙ্ক 1 থেকে 5 ORDER BY rank ASCতম র‌্যাঙ্কে অর্ডার করতে চান তবে ব্যবহার করুন (ASCend ক্রমে র‌্যাঙ্ক অনুসারে ক্রম ক্রম)। আমি অনুমান করি যে আপনি যা বোঝাতে চেয়েছেন তবে সঠিকভাবে অর্ডার করা হয়নি
ব্লুক্যাটি

উত্তর:


179

এই একবার দেখুন ।

আপনার জিজ্ঞাসাটি এতে পরিবর্তন করুন:

SET @rank=0;
SELECT @rank:=@rank+1 AS rank, itemID, COUNT(*) as ordercount
  FROM orders
  GROUP BY itemID
  ORDER BY ordercount DESC;
SELECT @rank;

শেষ নির্বাচনটি আপনার গণনা।


1
এটি ফলাফল সেটটিতে র‌্যাঙ্ক যুক্ত করে, তবে তাদের যথাযথ ক্রমে রাখে না - ফলাফলগুলি সহ আপডেট করা প্রশ্ন
জর্জ

1
রাখার চেষ্টা করুন ORDER BY ordercount DESC, এবং তারপরে পুরো ক্যোয়ারিকে অন্যটিতে মোড় করুন SELECTযা প্রথমটি থেকে সমস্ত কিছু পায় তবে র‌্যাঙ্ক কলাম দ্বারা আদেশ (এই ক্ষেত্রে 0)।
মাইক Cialowicz

1
আপনি এর একটি উদাহরণ দেখাতে পারেন? আমি কীভাবে নির্বাচনগুলি মোড়ানো করব?
জর্জ

9
Swamibebop এর উত্তর দেখুন
thaddeusmt

1
@MikeCialowicz এই কাজ করে না । সঠিক উত্তরের জন্য আমার সমাধান বা স্বামীবপের সমাধান দেখুন।
পেসারিয়ার

178
SELECT @rn:=@rn+1 AS rank, itemID, ordercount
FROM (
  SELECT itemID, COUNT(*) AS ordercount
  FROM orders
  GROUP BY itemID
  ORDER BY ordercount DESC
) t1, (SELECT @rn:=0) t2;

1
স্পষ্ট করার জন্য ধন্যবাদ, এটি আমার বাইরে থাকা-ওর্ডার সমস্যাটি সমাধান করেছিল।
thaddeusmt

1
ধন্যবাদ, এটি আমার জন্য সত্যই কার্যকর ছিল :) আমি অবাক হয়েছি ফলাফলের সেট থেকে সারি 'সূচকগুলি' পাওয়ার আরও সহজ কোনও উপায় নেই ... তবে যাইহোক ধন্যবাদ এটি কার্যকর ছিল না।
ইঁদুর

আপনি SELECT in @rn: = \ @ rn + 1 AS র‌্যাঙ্ক, আইটেমআইডি, অর্ডারকাউন্ট, \ @ টট: = tot @ টোট + অর্ডারকাউন্টকে টোটকাউন্ট হিসাবে পরিবর্তন করে একটি ইনক্রিমেন্টাল টোটকাউন্টের সাথে একটি চতুর্থ সারিতে যুক্ত করতে পারেন। Value @tot এর প্রাথমিক মানটি সংজ্ঞায়িত করতে টি -2: (নির্বাচন করুন = @ টট: = 0) টি 3 এর পরে যুক্ত করা উচিত। মিনি-মার্কডাউন ফর্ম্যাটিংটি ছুঁড়ে দেওয়ার জন্য আমাকে use প্রতি every @ এর আগে মুছুন।
জান এহরহার্ড

2
কাউকে প্রাসঙ্গিকতা ব্যাখ্যা করতে পারবেন t1এবং t2?
জেরেড

2
@ জ্যারেড, মাইএসকিউএল সিনট্যাক্সের সেখানে উপস্থিত হওয়ার জন্য কিছু দরকার। এটি কোন কিছুই হতে পারেন, এমনকি xএবং y
পেসারিয়ার 11

31

স্বামীব্বপের সমাধান কাজ করে তবে table.*সিনট্যাক্সের সুবিধা নিয়ে আমরা অভ্যন্তরের কলামের নামগুলি পুনরাবৃত্তি করা এড়াতেselect এবং একটি সহজ / খাটো ফলাফল পেতে পারি:

SELECT @r := @r+1 , 
       z.* 
FROM(/* your original select statement goes in here */)z, 
(SELECT @r:=0)y;

সুতরাং এটি আপনাকে দেবে:

SELECT @r := @r+1 , 
       z.* 
FROM(
     SELECT itemID, 
     count(*) AS ordercount
     FROM orders
     GROUP BY itemID
     ORDER BY ordercount DESC
    )z,
    (SELECT @r:=0)y;

আপনি কি যথাযথভাবে জানেন যে @r := @r + 1একটি নির্বাচিত বিবৃতি ব্যবহার করা কেন কাজ করে, তবে এটি যদি কোনও সঞ্চিত পদ্ধতিতে থাকে তবে declare r int; set r = 0;এটি অভিযোগ করে (অন r := r +1)?
ড্যান এম

@ পেসারিয়ার, দ্বিতীয় সারির ক্রমটি কি দ্বিতীয় কোথাও নিশ্চিত? আমি জানি যে ধারা দ্বারা আদেশ ব্যতীত নির্বাচনের মাধ্যমে সারিগুলির ক্রমানুসারে কোথাও গ্যারান্টি নেই এবং বাহ্যিকতম নির্বাচনটি ঠিক এটি, যদিও এটি অভ্যন্তরীণ অর্ডার করা নির্বাচন থেকে নির্বাচন করে, তাই এটি ব্যতিক্রম হতে পারে। তবে এটি যদি না হয় তবে আমি দেখতে পাচ্ছি না যে এটি কীভাবে সঠিক সমাধান হিসাবে চিবুর মাইকের মতো একই ত্রুটিযুক্ত থাকতে পারে - কোন আদেশে কোন রেকর্ড নির্বাচন করা হবে এবং তাদের সংখ্যা নির্ধারণ করা হবে তার কোনও গ্যারান্টি নেই।
ড্যান এম

অর্ডার বাই ক্ষেত্রের তালিকায় না থাকলে কেন কাজ করছে না সে সম্পর্কে আপনার কোনও ধারণা আছে? আমার ফলাফল দেখুন: hastebin.com/aluqefunoy.rb
শীতকালে

11

এটি করতে আপনি মাইএসকিউএল ভেরিয়েবল ব্যবহার করতে পারেন। এর মতো কিছুতে কাজ করা উচিত (যদিও এটি দুটি প্রশ্নের সমন্বয়ে গঠিত)।

SELECT 0 INTO @x;

SELECT itemID, 
       COUNT(*) AS ordercount, 
       (@x:=@x+1) AS rownumber 
FROM orders 
GROUP BY itemID 
ORDER BY ordercount DESC; 

2
সাবধান, এটি কাজ করবে না কারণ order by ভেরিয়েবলটি মূল্যায়ন করার পরে ঘটে @x। অন্যান্য কলামগুলি ব্যবহার করে অর্ডার দিয়ে পরীক্ষা করে দেখুন। descএবং উভয় সঙ্গে পরীক্ষা asc। আপনি দেখতে পাবেন যে বহুবার তারা ব্যর্থ হবে এবং কেবলমাত্র যখন এটি কার্যকর হয়, এটি আপনার মূল "নির্বাচন" এর ক্রম অনুসারে একই অর্ডার থাকার কারণে খাঁটি ভাগ্যের দ্বারা order by। আমার সমাধান এবং / অথবা স্বামীবপের সমাধান দেখুন।
পেসারিয়ার

@ পেসারিয়ার সম্পর্কে আপনি কি নিশ্চিত? আমি অনুরূপ ক্যোয়ারিকে অন্য একটি উদাহরণে ক্লান্ত করেছি (মূলত সংখ্যার কলাম থেকে নির্বাচন করুন এবং তাদের ক্রম অনুসারে সংখ্যায়ন করুন) দেখে মনে হয়েছিল যে আমি যদি ভার / সারি সংখ্যা দ্বারা আদেশ করি, যখন এটি ফলাফলের সারিগুলির ক্রম পরিবর্তন করে, তবে প্রতিটি সংখ্যার একই সারির সংখ্যা ছিল। তবে আমি যদি সংখ্যার কলাম অনুসারে অর্ডার করি তবে ASC/ / DESCসেই ক্রমটি পরিবর্তন করবে যাতে এই সংখ্যাগুলি সংখ্যায়িত হয়েছিল (সবচেয়ে ছোট থেকে বড় বা বিপরীতে)। সুতরাং দেখে মনে হচ্ছে সেই ক্ষেত্রে order byপ্রথমে মূল্যায়ন করা হয়েছিল।
ড্যান এম

1

এটি এখন মাইএসকিউএল 8.0 এবং মারিয়াডিবি 10.2 এ অন্তর্নির্মিত:

SELECT
  itemID, COUNT(*) as ordercount,
  ROW_NUMBER OVER (PARTITION BY itemID ORDER BY rank DESC) as rank
FROM orders
GROUP BY itemID ORDER BY rank DESC
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.