মাইএসকিউএল-এ FIELD () দ্বারা অর্ডার কীভাবে অভ্যন্তরীণভাবে কাজ করে


37

আমি বুঝতে পারি কীভাবে ORDER BYক্লজ কাজ করে এবং কীভাবে FIELD()ফাংশনটি কাজ করে। আমি যেটি বুঝতে চাই তা হল দুজনেই কীভাবে এক সাথে কাজ করে বাছাই করার জন্য। সারিগুলি কীভাবে পুনরুদ্ধার করা হয় এবং কীভাবে সাজানো ক্রম অর্ডার হয়

+----+---------+
| id |  name   |
+----+---------+
|  1 | stan    |
|  2 | kyle    |
|  3 | kenny   |
|  4 | cartman |
+----+---------+ 

SELECT * FROM mytable WHERE id IN (3,2,1,4) ORDER BY FIELD(id,3,2,1,4)

উপরের ক্যোয়ারীর ফলাফল হবে

+----+---------+
| id |  name   |
+----+---------+
|  3 | kenny   |
|  2 | kyle    |
|  1 | stan    |
|  4 | cartman |
+----+---------+ 

অর্ডার 3, 2, 1, 4 দ্বারা বলার অনুরূপ

প্রশ্ন

  • এটি অভ্যন্তরীণভাবে কীভাবে কাজ করে?
  • মাইএসকিউএল কীভাবে সারিগুলি পেয়ে যায় এবং সাজানোর ক্রম গণনা করে?
  • মাইএসকিউএল কীভাবে জানতে পারে যে এটির আইডি কলাম অনুসারে বাছাই করতে হবে?

1
আপনার প্রশ্নের এই প্রকরণটির চেষ্টা করুন: SELECT *, FIELD(id,3,2,1,4) AS f FROM mytable WHERE id IN (3,2,1,4);তারপরে যুক্ত করুন ORDER BY fবা ORDER BY FIELD(id,3,2,1,4)আবার চেষ্টা করুন।
ypercubeᵀᴹ

উত্তর:


64

রেকর্ড এর জন্য

SELECT * FROM mytable WHERE id IN (1,2,3,4) ORDER BY FIELD(id,3,2,1,4);

পাশাপাশি কাজ করা উচিত কারণ আপনাকে WHEREধারাটিতে তালিকাটি অর্ডার করতে হবে না

এটি কীভাবে কাজ করে,

  • ফিল্ড () এমন একটি ফাংশন যা আপনার জন্য অনুসন্ধান করা মানটি যদি বিদ্যমান থাকে তবে কমা-বিস্মৃত তালিকার সূচী অবস্থানটি দেয়।

    • যদি আইডি = 1, তারপরে ফিল্ড (আইডি, 3,2,1,4) 3 টি প্রত্যাবর্তন করে (যেখানে তালিকায় 1 টি অবস্থান রয়েছে)
    • যদি আইডি = 2, তারপরে ফিল্ড (আইডি, 3,2,1,4) 2 প্রদান করে (যেখানে 2 তালিকার মধ্যে রয়েছে)
    • যদি আইডি = 3, তারপরে ফিল্ড (আইডি, 3,2,1,4) 1 প্রদান করে (যেখানে তালিকার 3 অবস্থান রয়েছে)
    • যদি আইডি = 4 হয়, তবে ফিল্ড (আইডি, 3,2,1,4) 4 টি প্রত্যাবর্তন করবে (যেখানে তালিকার 4 অবস্থান রয়েছে)
    • যদি আইডি = অন্য কিছু, তবে FIELD (আইডি, 3,2,1,4) 0 প্রদান করে (তালিকায় নেই)
  • ORDER BYমান কি দ্বারা মূল্যায়ন করা হয় ক্ষেত্র () আয়

আপনি সব ধরণের অভিনব অর্ডার তৈরি করতে পারেন

উদাহরণস্বরূপ, আইএফ () ফাংশন ব্যবহার করে

SELECT * FROM mytable
WHERE id IN (1,2,3,4)
ORDER BY IF(FIELD(id,3,2,1,4)=0,1,0),FIELD(id,3,2,1,4);

এটি তালিকার শীর্ষে প্রথম 4 আইডি প্রদর্শিত হবে, অন্যথায়, এটি নীচে প্রদর্শিত হবে। কেন?

এর মধ্যে ORDER BYআপনি হয় 0 বা 1 পান।

  • যদি প্রথম কলামটি 0 হয় তবে প্রথম 4 টি আইডির মধ্যে যে কোনওটিকে উপস্থিত করুন
  • প্রথম কলামটি যদি 1 হয় তবে এটি পরে প্রদর্শিত হবে

প্রথম কলামে এটি ডিইএসসি দিয়ে ফ্লিপ করি

SELECT * FROM mytable
WHERE id IN (1,2,3,4)
ORDER BY IF(FIELD(id,3,2,1,4)=0,1,0) DESC,FIELD(id,3,2,1,4);

এর মধ্যে ORDER BY, আপনি এখনও 0 বা 1 পান।

  • প্রথম কলামটি যদি 1 হয় তবে প্রথম 4 আইডির উপস্থিতি বাদে কিছু করুন।
  • প্রথম কলামটি যদি 0 হয় তবে প্রথম 4 আইডিকে মূল ক্রমে উপস্থিত করুন

আপনার বাস্তব প্রশ্ন

আপনি যদি গুরুত্ব সহকারে এটিতে অন্তর্ভুক্ত করতে চান তবে বইয়ের 189 এবং 192 পৃষ্ঠাগুলি দেখুন

মাইএসকিউএল ইন্টার্নাল

একটি সত্য গভীর ডুব জন্য।

সংক্ষেপে, একটি সি ++ শ্রেণি রয়েছে ORDER *order( ORDER BYঅভিব্যক্তি গাছ)। ইন JOIN::prepare, *orderনামে পরিচিত একটি ফাংশনে ব্যবহৃত হয় setup_order()ক্লাসের মাঝখানে কেন JOIN? প্রতিটি ক্যোয়ারী, এমনকি একটি একক টেবিলের বিপরীতে একটি জিজ্ঞাসা সবসময়ই যোগিন হিসাবে প্রক্রিয়াজাত করা হয় (আমার পোস্টটি দেখুন কোনও জিন শর্ত এবং কোন শর্তের মধ্যে একটি কার্যকর করার পার্থক্য রয়েছে? )

এই সমস্ত জন্য উত্স কোড হয় sql/sql_select.cc

স্পষ্টতই, ORDER BYগাছটি মূল্যায়ন করতে চলেছে FIELD(id,3,2,1,4)। সুতরাং, 0,1,2,3,4 নম্বরগুলি এর সাথে জড়িত সারির একটি রেফারেন্স বহন করার সময় সাজানো মানগুলি।


1
এটি একটি অসামান্য দুর্দান্ত ব্যাখ্যা। এই পদ্ধতিগুলি ব্যবহার করে আমি 3 টি অর্ডার পেতে সক্ষম হয়েছি, একটি প্রাথমিক প্রথম মান যা সেটের সর্বাধিক, তারপরে FIELD দ্বারা, তারপরে FIELD সেটে নয় এমনগুলির জন্য অন্য কলাম দ্বারা। এমন কিছু বিষয় যা আমি কিছুক্ষণ আগে স্বপ্নেও ভাবতাম না। সত্যিই এটি কীভাবে কাজ করে তা ব্যাখ্যা করার জন্য সময় দেওয়ার জন্য ধন্যবাদ।
Lizardx

ধরুন আছে Nউভয় মান INএবং FIELD। এই উদাহরণে N=4। আমি কি সঠিকভাবে বুঝতে পারি যে এই কোয়েরিটি কমপক্ষে ~N^2অপারেশনগুলি করতে চলেছে । কারণ প্রতিটি FIELDগণনা ~Nপ্রতিটি সারির জন্য একবার তুলনা করে। যদি Nএটির পক্ষে এটি বেশ ধীর হয় তবে এটি খুব ভাল পদ্ধতির নয়?
গেরম্যান

@ গেরম্যান FIELD()ফাংশনটি একটি ক্রিয়াকলাপ হওয়া উচিত O(1)কারণ FIELD()একটি সংখ্যার সূচক রয়েছে id। সুতরাং আমি O(n)সারিগুলির উপর ভিত্তি করে অন্য কিছু দেখতে পাচ্ছি না । আমি FIELD()এমন কোনও পুনরাবৃত্ত অপারেশন করতে দেখছি না GREATEST()যা করার দরকার হবে।
রোল্যান্ডোমাইএসকিউএলডিবিএ

@ রোল্যান্ডোমাইএসকিউএলডিবিএ আমার বক্তব্যটি হল যে যদি FIELDএর Nসাথে তুলনা করার যুক্তি থাকে তবে তা Nতুলনা কার্যকর করবে । এটি না করে Nঅন্য সংখ্যার সাথে কীভাবে একটি সংখ্যা তুলনা করতে চলেছে O(N)? আমি কেবলমাত্র সম্ভাবনাটিই ভাবতে পারি হ্যাশ বা আর্গুমেন্টের গাছের মতো একটি বিশেষ ডেটা কাঠামোর মাধ্যমে এক ধরণের অপ্টিমাইজেশন। আসলে আমি জানি যে INএরকম অপ্টিমাইজেশন রয়েছে। আমি সম্পর্কে জানি না FIELD। "সংখ্যার সূচক" বলতে কী বোঝ?
Gherman

1
আরে @ রেইমন্ডনিজল্যান্ড, সিএসই-র বিবৃতিটি আরও বোধগম্য this এই ক্ষেত্রে, সিনট্যাকটিক চিনির কেবল কম লেখালেখি রয়েছে।
রোল্যান্ডোমাইএসকিউএলডিবিএ

1

সম্ভবত এটি বাস্তব কোড থেকে খুব দূরে থাকবে তাই আপনি যা চেয়েছিলেন তা থেকে পর্যাপ্ত স্তরটি পর্যাপ্ত নয় not

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


এই ব্যাখ্যাটি FIELDগণনায় কীভাবে কাজ করে তা বিবেচনায় নেবে না । আমি আশঙ্কা করছি এটি পারফরম্যান্সে গুরুত্বপূর্ণ প্রভাব ফেলতে পারে।
গেরম্যান

@Gherman আমি তাই হয়, তা মনে করি, যদি না আপনি আর্গুমেন্ট খুব দীর্ঘ তালিকা ব্যবহার করছেন (যেমন ফাংশন না আর্গুমেন্ট সংখ্যা রৈখিক । ডেটা অ্যাক্সেস মাত্রার একটি আদেশ সহজ তুলনা তুলনায় ধীর হয়।
jkavalik

হ্যাঁ, যুক্তিগুলির দীর্ঘ তালিকা। এই উদাহরণে রেকর্ড রয়েছে যতগুলি আর্গুমেন্ট আছে।
German

আমি কেবল কয়েকশো বা কয়েক
হাজারকে লেবেল

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