विशिष्ट आईडी मानों द्वारा मयस्कल आदेश


95

क्या कॉलम मानों (पूर्व) के पूर्वनिर्धारित सेट का उपयोग करके "ऑर्डर" द्वारा mysql में छांटना संभव है: जैसे (आईडी = 1,5,4,3) क्रम से तो मुझे रिकॉर्ड 1, 5, 4, 3 मिलेगा। आदेश निषिद्ध?

अद्यतन: mysql का दुरुपयोग करने के बारे में ;-) मुझे समझाना होगा कि मुझे इसकी आवश्यकता क्यों है ...

मैं चाहता हूं कि मेरा रिकॉर्ड हर 5 मिनट में बेतरतीब ढंग से बदले। मेरे पास अद्यतन तालिका को अलग, यादृच्छिक क्रम में रखने के लिए एक क्रोन कार्य है। बस एक समस्या है! पृष्ठांकन। मेरे पास एक आगंतुक होगा जो मेरे पृष्ठ पर आता है और मैं उसे पहले 20 परिणाम देता हूं। वह 6 मिनट तक प्रतीक्षा करेगा और पेज 2 पर जाएगा और उसके गलत परिणाम होंगे क्योंकि क्रमबद्ध क्रम पहले ही बदल चुका था।

इसलिए मैंने सोचा कि अगर वह मेरी साइट पर आता है तो मैंने एक सत्र के लिए सभी आईडी डाल दिए हैं और जब वह पृष्ठ 2 में होता है तो उसे सही रिकॉर्ड मिलते हैं, भले ही छंटाई पहले से ही बदल गई हो।

क्या ऐसा करने का कोई और तरीका, बेहतर है?


क्या आप पूछ रहे हैं कि क्या कोई ऐसा तरीका है जिससे mysql कोई विशेष क्रम में ऑर्डर कर सकता है?
स्टेफगोसेलिन

1
ऐसा लगता है कि या तो आपका डेटा मॉडल टूट गया है / अपूर्ण है ( यह आदेश कहां से आया है?) या वैकल्पिक रूप से आप MySQL का दुरुपयोग कर रहे हैं।
derobert

जवाबों:


202

आप ORDER BY और FIELD फ़ंक्शन का उपयोग कर सकते हैं। Http://lists.mysql.com/mysql/209784 देखें

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

यह फ़ील्ड () फ़ंक्शन का उपयोग करता है , जो "1, str2, str2, str2, ... सूची में str के सूचकांक (स्थिति) को लौटाता है। प्रलेखन के अनुसार" रिटर्न 0 यदि str नहीं मिला है "। तो वास्तव में आप इस फ़ंक्शन के रिटर्न मान द्वारा निर्धारित परिणाम को सॉर्ट करते हैं जो दिए गए सेट में फ़ील्ड मान का सूचकांक है।


मुझे यह प्रयोग किए बिना भी काम करने के लिए लगता है: WHERE ID IN (1,5,4,3)
टीवी-सी -15

आप इसका उपयोग कैसे करेंगे?
नोनो लंदन

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

ORDER BY के बारे में mysql के आधिकारिक दस्तावेज पर , किसी ने पोस्ट किया है कि आप 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

इस तरह से

५ ४ ३ १ १ २ ६ 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जब भी आपके आदेश मानदंड में बदलाव होता है, तो आपको अपना बदलाव नहीं करना पड़ता है - बस ऑर्डर तालिका में डेटा बदल दें।


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

2
क्या आप आगे बता सकते हैं? यह स्वीकृत उत्तर के समान दिखता है, लेकिन मुझे नहीं लगता कि ASC OR DESCयह उचित वाक्यविन्यास है
निको हसे

@NicoHaase ASC और DESC के बीच का अंतर है यदि आप asc का उपयोग करते हैं तो फ़ील्ड फ़ंक्शन में उपयोग की जाने वाली आईडी अंत में आ जाएंगी और यदि आप DESC का उपयोग करते हैं तो फ़ील्ड फ़ंक्शन में id पहले
आएँगी

@NicoHaase आप या तो ASC या DESC का उपयोग कर सकते हैं या तो क्वेरी के साथ आवश्यकता के लिए एक accroding कर सकते हैं
Hisham shahid

इसलिए आप दोनों को एक क्वेरी में उपयोग नहीं कर सकते। निको मुझे लगता है कि आपने सुझाव दिया था कि आपने अपना उत्तर वाक्य रचना को सही बनाया है। मुझे पूरा यकीन है कि वह एएसडी और
डीईएससी से

0

यदि आपको परिणाम में पहले एक ही आईडी का ऑर्डर करने की आवश्यकता है, तो आईडी का उपयोग करें।

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 सेंट क्वेरी का उपयोग करें और यदि आप कई आईडी के लिए चाहते हैं, तो 2-क्वेरी का उपयोग करें
राजेश खरतमोल

0

यदि आप परिणाम में अंतिम आईडी ऑर्डर करना चाहते हैं, तो आदेश का उपयोग करें। (उदा: आप अंतिम और सभी शहर सूची वर्णमाला क्रम में "अन्य" विकल्प चाहते हैं।)

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

यदि मेरे पास 5 शहर हैं, उदाहरण के लिए, मैं ड्रॉपडाउन में "अन्य" विकल्प प्रदर्शन के साथ वर्णमाला क्रम में शहर दिखाना चाहता हूं तो हम इस क्वेरी का उपयोग कर सकते हैं। उदाहरण देखें दूसरी आईडी (आईडी: 2) में मेरी तालिका में अन्य दिखाए जा रहे हैं, इसलिए मैं उपरोक्त क्वेरी में "जब आईडी = 2" का उपयोग कर रहा हूं।

DB तालिका में रिकॉर्ड:

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

मेरा आउटपुट:

Ambala  
Bangalore  
Mumbai  
Pune
Other

2
अपने कोड में कुछ स्पष्टीकरण जोड़ने का प्रयास करें, यह आपके उत्तर को अधिक स्पष्ट और समझने योग्य बना देगा। कृपया stackoverflow.com/help/how-to-answer
32cupo

यदि आप केवल एक आईडी के लिए ऑर्डर का उपयोग करना चाहते हैं (जैसे: आप अंतिम और सभी शहर सूची में "अन्य" विकल्प को वर्णानुक्रम में दिखाना चाहते हैं।) तो आप इस क्वेरी का उपयोग कर सकते हैं। यह मेरे लिए काम कर रहा है।
प्रीति
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.