নির্দিষ্ট আইডি মান দ্বারা MySQL অর্ডার


96

কলাম মানগুলি (আইডি) এর পূর্বনির্ধারিত সেট ব্যবহার করে "অর্ডার বাই" দ্বারা মাইএসকিএল অনুসারে বাছাই করা যেমন: আইডির মাধ্যমে (আইডি = 1,5,4,3) অর্ডার করা যায় তাই আমি এতে রেকর্ড 1, 5, 4, 3 পেতে পারি অর্ডার আউট?

আপডেট: মাইএসকিএল আপত্তিজনক সম্পর্কে ;-) সম্পর্কে আমার কেন এটি প্রয়োজন তা ব্যাখ্যা করতে হবে ...

আমি প্রতি 5 মিনিটে আমার রেকর্ডগুলি এলোমেলোভাবে পরিবর্তন করতে চাই। এতে আলাদা, এলোমেলোভাবে সাজানোর ক্রম রাখার জন্য আপডেট টেবিলটি করা আমার ক্রোন টাস্ক। শুধু একটি সমস্যা আছে! পৃষ্ঠা। আমার পৃষ্ঠায় আগত আমার কাছে একজন দর্শনার্থী থাকবে এবং আমি তাকে প্রথম 20 টি ফলাফল দেই। তিনি 6 মিনিট অপেক্ষা করবেন এবং পৃষ্ঠা 2 এ যাবেন এবং সাজানোর ক্রমটি অলরেডি পরিবর্তিত হওয়ায় তার ভুল ফলাফল হবে।

সুতরাং আমি ভেবেছিলাম যে তিনি যদি আমার সাইটে আসেন তবে আমি সমস্ত আইডি একটি সেশনে রেখেছি এবং পৃষ্ঠা 2 এ থাকা অবস্থায় সে সঠিক রেকর্ড খুঁজে পাবে এমনকি বাছাই করা অলরেডি পরিবর্তন হয়েছে কিনা।

এটি করার জন্য আরও ভাল কোনও উপায় আছে কি?


আপনি কি জিজ্ঞাসা করছেন যে কোনও উপায় নেই যে কোনও মাইএসকিএল কোনও নির্দিষ্ট ক্রমে অর্ডার করতে পারে?
স্টেফগোসেলিন

4
মত শোনাচ্ছে হয় আপনার তথ্য মডেল নষ্ট হয়ে গেছে / অসম্পূর্ণ ( যেখানে এই আদেশ থেকে আসে?) অথবা অন্যথায় আপনি মাইএসকিউএল অপব্যবহারের করছি।
ডারোবার্ট

উত্তর:


204

আপনি অর্ডার বাই এবং ফিল্ড ফাংশন ব্যবহার করতে পারেন। Http://lists.mysql.com/mysql/209784 দেখুন

SELECT * FROM table ORDER BY FIELD(ID,1,5,4,3)

এটি ফিল্ড () ফাংশনটি ব্যবহার করে, যা "str1, str2, str3, ... তালিকার মধ্যে str এর সূচক (অবস্থান) প্রদান করে str সুতরাং প্রকৃতপক্ষে আপনি ফলাফলটি সাজান এই ফাংশনের রিটার্ন মান দ্বারা প্রদত্ত সেটে ক্ষেত্রের মানের সূচক।


আমি এটিও ব্যবহার না করেই এই কাজটি করতে পারছি বলে মনে হচ্ছে না: WHERE ID IN (1,5,4,3)
TV-C-15

4
কোনটি মান সহ আপনি এটি কীভাবে ব্যবহার করবেন?
ননো লন্ডন

30

আপনি এটির জন্য ব্যবহার করতে সক্ষম হবেন CASE:

ORDER BY CASE id
  WHEN 1 THEN 1
  WHEN 5 THEN 2
  WHEN 4 THEN 3
  WHEN 3 THEN 4
  ELSE 5
END

18

অর্ডার বাই মাইএসকিএল- এর অফিসিয়াল ডকুমেন্টেশনে , কেউ পোস্ট করেছেন যে আপনি FIELDএই বিষয়টির জন্য এটি ব্যবহার করতে পারেন :

SELECT * FROM table ORDER BY FIELD(id,1,5,4,3)

এটি নিরীক্ষিত কোড যা তত্ত্বের সাথে কাজ করা উচিত।


7
SELECT * FROM table ORDER BY id='8' DESC, id='5' DESC, id='4' DESC, id='3' DESC

উদাহরণস্বরূপ যদি আমার কাছে 10 টি রেজিস্ট্রেশন থাকে তবে এইভাবে প্রথমে আইডি 1, 5, 4 এবং 3 প্রদর্শিত হবে, অন্য রেজিস্ট্রেশনগুলি পরবর্তী প্রদর্শিত হবে।

সাধারণ এক্সবিশন 1 2 3 4 5 6 7 8 9 10

এইভাবে

8 5 4 3 1 2 6 6 9 9 10


ঠিক আছে পরামর্শের জন্য ধন্যবাদ
ব্রুনো মাঙ্গিনী আলভেস

6

এটি সমাধান করার আরও একটি উপায় আছে। একটি পৃথক টেবিল যুক্ত করুন, এরকম কিছু:

CREATE TABLE `new_order` (
  `my_order` BIGINT(20) UNSIGNED NOT NULL,
  `my_number` BIGINT(20) NOT NULL,
  PRIMARY KEY (`my_order`),
  UNIQUE KEY `my_number` (`my_number`)
) ENGINE=INNODB;

এই টেবিলটি এখন আপনার নিজের অর্ডার প্রক্রিয়াটি সংজ্ঞায়িত করতে ব্যবহৃত হবে।

সেখানে আপনার মান যুক্ত করুন:

my_order | my_number
---------+----------
       1 |         1
       2 |         5
       3 |         4
       4 |         3

... এবং তারপরে এই নতুন টেবিলে যোগদানের পরে আপনার এসকিউএল স্টেটমেন্টটি সংশোধন করুন।

SELECT *
FROM your_table AS T1
INNER JOIN new_order AS T2 on T1.id = T2.my_number
WHERE ....whatever...
ORDER BY T2.my_order; 

এই সমাধান সামান্য অন্যান্য সমাধানের তুলনায় আরো জটিল, কিন্তু এই ব্যবহার করে আপনি নিজের পরিবর্তন হবে না SELECTযখনই আপনার অর্ডার পরিবর্তন criteriums -statement - শুধু অর্ডার সারণীতে ডেটা পরিবর্তন করুন।


1

যদি আপনাকে ফলাফলটিতে প্রথমে কোনও একক আইডি অর্ডার করতে হয় তবে আইডিটি ব্যবহার করুন।

select id,name 
from products
order by case when id=5 then -1 else id end

যদি আপনাকে একাধিক আইডির ক্রম দিয়ে শুরু করতে হয় তবে আপনি কোনও INবিবৃতি দিয়ে যা ব্যবহার করবেন তার অনুরূপ একটি সংগ্রহ নির্দিষ্ট করুন ।

select id,name 
from products
order by case when id in (30,20,10) then -1 else id end,id

আরও কিছু বিবরণ যুক্ত করুন
ম্যাথিউস সানি

যদি আপনি কেবল একটি আইডির মাধ্যমে অর্ডার ব্যবহার করতে চান তবে 1 ম কোয়েরি ব্যবহার করুন এবং যদি আপনি একাধিক
আইডির

0

আপনি যদি শেষের দিকে কোনও একক আইডি অর্ডার করতে চান তবে অর্ডারটি কেস দ্বারা ব্যবহার করুন। (যেমন: আপনি বর্ণমালা অনুসারে সর্বশেষে এবং সমস্ত শহর তালিকার শোতে "অন্যান্য" বিকল্পটি চান))

select id,city 
from city
order by case 
when id = 2 then city else -1 
end, city ASC

উদাহরণস্বরূপ, যদি আমার 5 টি শহর থাকে, তবে আমি ড্রপডাউনটিতে সর্বশেষ "অন্যান্য" বিকল্প প্রদর্শন দিয়ে শহরটিকে বর্ণানুক্রমিক ক্রমে প্রদর্শন করতে চাই তবে আমরা এই ক্যোয়ারীটি ব্যবহার করতে পারি। উদাহরণস্বরূপ অন্যরা দ্বিতীয় আইডিতে আমার টেবিলে প্রদর্শিত হচ্ছে (আইডি: 2) তাই উপরের ক্যোয়ারিতে আমি "যখন আইডি = 2" ব্যবহার করছি।

ডিবি টেবিলে রেকর্ড:

Bangalore - id:1
Other     - id:2
Mumbai    - id:3
Pune      - id:4
Ambala    - id:5

আমার আউটপুট:

Ambala  
Bangalore  
Mumbai  
Pune
Other

4
আপনার কোডটিতে কিছু ব্যাখ্যা যুক্ত করার চেষ্টা করুন, এটি আপনার উত্তরটিকে আরও স্পষ্ট এবং বোধগম্য করে তুলবে। অনুগ্রহ করে পড়ুন stackoverflow.com/help/how-to-answer
32cupo

যদি আপনি কেবল একটি আইডির মাধ্যমে অর্ডার ব্যবহার করতে চান (যেমন: আপনি বর্ণমালায় সর্বশেষে এবং সমস্ত নগরীর তালিকাতে "অন্যান্য" বিকল্পটি চান want তাই) আপনি এই ক্যোয়ারীটি ব্যবহার করতে পারেন। এটা আমার জন্য কাজ করছে।
প্রীতি

-1
SELECT * FROM TABLE ORDER BY (columnname,1,2) ASC OR DESC

4
আপনি কি আরও ব্যাখ্যা করতে পারেন? এটি গৃহীত উত্তরের মতো দেখায়, তবে আমি মনে করি না যে ASC OR DESCএটি যথাযথ বাক্য গঠন
নিকো হাজে

@ নিকোহেস এএসসি এবং ডিইএসসির মধ্যে পার্থক্য হ'ল আপনি যদি এসসি ব্যবহার করেন তবে ফিল্ড ফাংশনে আপনি যে আইডি ব্যবহার করেন তা শেষ হয়ে যায় এবং যদি আপনি ডিইএসসি ব্যবহার করেন তবে ক্ষেত্রের ফাংশনে
হিশাম শাহেদ

@ নিকোহেস আপনি যে কোনও প্রশ্নের প্রয়োজন অনুসারে এএসসি বা ডিইএসসি ব্যবহার করতে পারেন
হিশাম

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

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