মাইএসকিউএল - IN এর মধ্যে মান দ্বারা অর্ডার ()


107

আমি প্রত্যাশা করছি যে আইটেমগুলি IN () ফাংশনে প্রবেশ করার আদেশ অনুসারে নিম্নলিখিত ক্যোয়ারিতে ফেরত পাঠানো হয়েছে ।

ইনপুট:

SELECT id, name FROM mytable WHERE name IN ('B', 'A', 'D', 'E', 'C');

আউটপুট:

|   id   |   name  |
^--------^---------^
|   5    |   B     |
|   6    |   B     |
|   1    |   D     |
|   15   |   E     |
|   17   |   E     |
|   9    |   C     |
|   18   |   C     |

কোন ধারনা?

উত্তর:


231
SELECT id, name
FROM mytable
WHERE name IN ('B', 'A', 'D', 'E', 'C')
ORDER BY FIELD(name, 'B', 'A', 'D', 'E', 'C')

মাঠ ফাংশন স্ট্রিং অবশিষ্ট তালিকার প্রথম স্ট্রিং এর অবস্থান ফেরৎ।

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


9
@ ভ্লাদিমির - হ্যাঁ, এটি মাইএসকিউএল-নির্দিষ্ট। প্রশ্নের মাইএসকিএল ট্যাগ রয়েছে।
আয়মান হৌরিহ

দুর্দান্ত, ডিবি সুইচের পরে ওরাকল এর "ডিকোড" ফাংশনের প্রতিস্থাপন।
মার্টিন লেন

7
সাবধান হন। যে কোনও অজানা সম্পত্তি মান (তালিকায় নেই) জ্ঞাত মানগুলির FIELD(letter, 'A', 'C')তুলনায় অগ্রাধিকার গ্রহণ করবে, অর্থাত্ , তালিকাটি প্রথমে প্রথমে বি লেটারের সাথে এন্ট্রি প্রদান করবে ( A | B | Cমান সহ রেকর্ডের একটি সেট ধরে )। এটি এড়ানোর জন্য, তালিকাটি বিপরীত করুন এবং DESC ব্যবহার করুন, যেমন FIELD(letter, 'C', 'A') DESC
গাজুস

আমি কীভাবে এটি এসকিউএল সার্ভারে অর্জন করব।
ব্যবহারকারী 123456

29

এখান থেকে অন্য একটি বিকল্প: http://dev.mysql.com/doc/refman/5.0/en/sorting-rows.html

select * 
from tablename 
order by priority='High' DESC, priority='Medium' DESC, priority='Low" DESC;

সুতরাং আপনার ক্ষেত্রে (অনির্ধারিত) হবে

SELECT id, name
FROM mytable
WHERE name IN ('B', 'A', 'D', 'E', 'C')
ORDER BY name = 'B', name = 'A', name = 'D', name =  'E', name = 'C';

আপনি যা করছেন তার উপর নির্ভর করে আমি এটি কিছুটা স্পর্শকাতর পেয়েছি তবে এটি কিছুক্ষণ খেলার পরে সর্বদা এটির কাজ করে।


এটি ক্ষেত্রের () ফাংশনটি অন্য উত্তর হিসাবে প্রস্তাবিত হিসাবে ব্যবহারের চেয়ে ভাল হতে পারে কারণ ক্ষেত্রটি () ব্যবহার করে সূচির ব্যবহারকে বাদ দেবে, তবে এই পদ্ধতিটি ব্যবহার করে সূচি ব্যবহার করার সুযোগ রয়েছে (যদিও এটি সূচকটি কতটা ভাল ব্যবহার করতে পারে তা নিশ্চিত নয়)
Junu


3

এটি কারও সাহায্য করতে পারে (পি_ কাস্টমার আইডি এসপিতে পাস করা হয়েছে):

SELECT CompanyAccountId, CompanyName
FROM account
LEFT JOIN customer where CompanyAccountId = customer.AccountId
GROUP BY CompanyAccountId
ORDER BY CASE WHEN CompanyAccountId IN (SELECT AccountId 
                                          FROM customer
                                          WHERE customerid= p_CustomerId) 
                 THEN 0
                 ELSE 1
          END, CompanyName;

বর্ণনা: আমি অ্যাকাউন্টের তালিকাটি প্রদর্শন করতে চাই। এখানে আমি এসপিতে একটি গ্রাহক আইডি পাস করছি। এখন এটি গ্রাহকদের সাথে লিঙ্কযুক্ত অ্যাকাউন্টগুলির সাথে অ্যাকাউন্টের নাম তালিকাভুক্ত করবে যেগুলি উপরে বর্ণানুক্রমিক ক্রমে অন্যান্য অ্যাকাউন্টগুলি অনুসরণ করে প্রদর্শিত হবে।


2

আপনার সারণীতে আপনার আর একটি কলাম (সংখ্যাসূচক) প্রয়োজন, যাতে আপনি সাজানোর ক্রমটি নির্দিষ্ট করেন। আইএন ক্লজটি এভাবে কাজ করে না।

B - 1
A - 2
D - 3
E - 4
C - 5

2
পছন্দসই অর্ডার প্রতি কোয়েরি হতে পারে।
ভ্লাদিমির দিউজেভ

0

শুধু ব্যবহার

order by INSTR( ',B,C,D,A,' ,  concat(',' , `field`, ',' ) )

মত পরিস্থিতি এড়ানো

 INSTR('1,2,3,11' ,`field`) 

আনর্ডারড ফলাফল সারি দিয়ে শেষ হবে: 1 এবং 11 পর্যায়ক্রমে

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