सवाल MySQL में नाम से ग्रुप से पहले तिथि और समय के अनुसार आदेश


मेरे पास एक सारणी है:

name    date         time
tom | 2011-07-04 | 01:09:52
tom | 2011-07-04 | 01:09:52
mad | 2011-07-04 | 02:10:53
mad | 2009-06-03 | 00:01:01

मुझे पहले सबसे पुराना नाम चाहिए:

SELECT * 
ORDER BY date ASC, time ASC 
GROUP BY name

(-> काम नहीं करता है!)

अब यह मुझे पहले पागल (पहले की तारीख है) तो टॉम देना चाहिए

लेकिन इसके साथ GROUP BY name ORDER BY date ASC, time ASC मुझे पहले नया पागल देता है क्योंकि यह इस तरह से पहले समूह करता है!

दोबारा: समस्या यह है कि मैं समूह से पहले दिनांक और समय से सॉर्ट नहीं कर सकता क्योंकि ग्रुप बाय द्वारा आदेश देने से पहले होना चाहिए!


44
2017-07-04 13:21


मूल


समूह द्वारा कुल कार्यों के साथ प्रयोग किया जाता है, क्रमबद्ध करने के लिए नहीं - क्या आपको यकीन है कि आपको यह अधिकार मिला है? - Neville Kuyt
क्या आपके पास एक बेहतर विचार है? मैंने अलग के बारे में सोचा लेकिन फिर भी तिथि और समय अलग है। - CodingYourLife
यदि दिनांक और समय कॉलम को गठबंधन करने का कोई तरीका था, तो आप वास्तव में केवल नाम चाहते हैं और जल्द से जल्द प्रत्येक नाम के लिए डेटाटाइम मूल्य? - Damien_The_Unbeliever
परिणाम होना चाहिए: पागल | 2009-06-03 | 00:01:01 / \ tom | 2011-07-04 | 01:09:52 - CodingYourLife
आपके चयन में कुल कार्य नहीं है, इसलिए "समूह द्वारा" कुछ भी नहीं करता है। वृश्चिक का जवाब काम करना चाहिए ... - Neville Kuyt


जवाब:


एक और तरीका:

SELECT * 
FROM (
    SELECT * 
    ORDER BY date ASC, time ASC 
) AS sub
GROUP BY name

पहले मेल खाने वाले परिणामों पर समूहों द्वारा समूह इसे हिट करता है। यदि वह पहला मिलान हिट होता है तो वह वही होता है जिसे आप चाहते हैं तो सब कुछ अपेक्षित काम करना चाहिए।

मैं इस विधि को पसंद करता हूं क्योंकि सबक्वायरी अन्य स्थितियों के साथ मिर्च करने के बजाए तार्किक अर्थ बनाता है।


63
2017-12-17 00:20



ध्यान दें कि दुर्भाग्य से यह दृष्टिकोण मारियाडीबी पर काम नहीं करेगा (हालांकि मारियाडीबी को MySQL के लिए ड्रॉप-इन प्रतिस्थापन माना जाता है): mariadb.com/kb/en/mariadb/... - rinogo
उपकुमारी में गायब होने से लगता है। - John Reid
यदि उप क्वेरी एक बड़ा सेट देता है तो यह बड़े डेटा सेट के साथ वास्तव में धीमा हो रहा है। - Nimeshka Srimal
यह मेरे डीबी के साथ woking नहीं है। मैं mysql 5.7.17 का उपयोग कर रहा हूँ - Sudhanshu Jain
Subquery में "LIMIT 18446744073709551615" जोड़ना मारियाडीबी पर चीजों को ठीक करना चाहिए, हालांकि यह एक गंदे समाधान है :) - gnysek


मुझे लगता है कि आप यही चाहते हैं:

SELECT name, min(date)
FROM myTable
GROUP BY name
ORDER BY min(date)

उस समय, आपको STR_TO_DATE के माध्यम से एक MySQL दिनांक बनाना होगा:

STR_TO_DATE(date + ' ' + time, '%Y-%m-%d %h:%i:%s')

इसलिए :

SELECT name, min(STR_TO_DATE(date + ' ' + time, '%Y-%m-%d %h:%i:%s'))
FROM myTable
GROUP BY name
ORDER BY min(STR_TO_DATE(date + ' ' + time, '%Y-%m-%d %h:%i:%s'))

26
2017-07-04 13:39



मुझे नहीं पता कि यह वास्तव में मेरी समस्या का उत्तर है या नहीं। यह समय के साथ सही ढंग से क्रमबद्ध प्रतीत नहीं होता है। क्या आप कृपया जांच सकते हैं कि सिंटैक्स यहां सही है या नहीं: ($ sql = 'चयन समूह से नाम समूह';) $ sql। = "न्यूनतम द्वारा आदेश (STR_TO_DATE (ऑर्डरडेट + '' + ऑर्डरटाइम, '% m /% d /% वाई% एच:% i:% s ')) "; - CodingYourLife
यदि आप समूह कर रहे हैं तो आप 'चयन *' नहीं कर सकते हैं। अपनी क्वेरी का चयन भाग बदलें। - Cyril Gandon
ठीक है और अब मैं $ पंक्ति ["तारीख"] कैसे कह सकता हूं? यह सही ढंग से क्रमबद्ध नहीं है ... यह सिर्फ तारीख के लिए न्यूल और आदेश क्रमबद्ध नहीं कहता है। - CodingYourLife
मैंने गलती की, यह% m /% d /% y नहीं है जिसे आपको चाहिए लेकिन% Y-% m-% d। मैंने क्वेरी अपडेट की। - Cyril Gandon
मुझे नहीं लगता कि यह काम करता है। इस बात का कोई आश्वासन नहीं है कि नामित कॉलम जो तारीख हो, उसी तारीख से ही है। अगर ऐसा लगता है कि आपकी समस्या हल हो गई है, तो ध्यान रखें कि इसकी संभावना अस्थिर से अधिक है। - Rob Forrest


चूंकि मुझे user1908688 के उत्तर पर टिप्पणी करने की अनुमति नहीं है, यहां मारियाडीबी उपयोगकर्ताओं के लिए एक संकेत है:

SELECT *
FROM (
     SELECT *
     ORDER BY date ASC, time ASC
     LIMIT 18446744073709551615
     ) AS sub
GROUP BY sub.name

https://mariadb.com/kb/en/mariadb/why-is-order-by-in-a-from-subquery-ignored/


15
2018-02-04 13:48



यह वही समाधान है जिसे मैं ढूंढ रहा था। स्रोत के लिए धन्यवाद! - naurel
मैं इस बात पर चिल्लाता हूं कि यह कितना हैकी है, लेकिन यह मारिया डीबी पर काम करने का एकमात्र तरीका प्रतीत होता है ... - rinogo
लगभग दो घंटों की खोज करने के बाद, यह समाधान है जो काम करता है। - kamran


यह मेरे लिए काम किया:

SELECT *
FROM your_table
WHERE id IN (
    SELECT MAX(id)
    FROM your_table
    GROUP BY name
);

7
2018-02-10 16:44





उप-चयन का प्रयोग करें:

select name, date, time
from mytable main
where date + time = (select min(date + time) from mytable where name = main.mytable)
order by date + time;

3
2017-07-04 13:34





इस सवाल पर मेरा एक अलग बदलाव था जहां मेरे पास केवल एक ही था DATETIME क्षेत्र और एक की जरूरत है limit एक के बाद group by या distinct के आधार पर अवरोही क्रमबद्ध करने के बाद datetime क्षेत्र, लेकिन यह मेरी मदद की है:

select distinct (column) from
(select column from database.table
order by date_column DESC) as hist limit 10

इस उदाहरण में विभाजित फ़ील्ड के साथ, यदि आप एक कॉन्सट पर सॉर्ट कर सकते हैं, तो हो सकता है कि आप कुछ इस तरह से दूर हो सकें:

select name,date,time from
(select name from table order by concat(date,' ',time) ASC)
as sorted

फिर यदि आप सीमित करना चाहते हैं तो आप अंत में अपना सीमा विवरण जोड़ देंगे:

select name,date,time from
(select name from table order by concat(date,' ',time) ASC)
as sorted limit 10

0
2017-07-21 20:06





यह सही जवाब नहीं है, लेकिन यह लोगों के लिए mysql में समूह से पहले पंक्ति आदेश देने के दृष्टिकोण के साथ कुछ समस्या हल करने के लिए उपयोगी हो सकता है।

मैं इस धागे पर आया, जब मैं नवीनतम पंक्ति खोजना चाहता था (जो है order by date desc लेकिन एक विशेष कॉलम प्रकार के लिए केवल एक परिणाम प्राप्त करें, जो है group by column name)।

ऐसी समस्या को हल करने के लिए एक और दृष्टिकोण बनाना है एकत्रीकरण का उपयोग करें।

इसलिए, हम सामान्य रूप से क्वेरी को चलाने दे सकते हैं, जो क्रमबद्ध क्रमबद्ध और नए क्षेत्र के रूप में परिचय max(doc) as latest_doc, जो एक ही कॉलम द्वारा समूहीकृत, नवीनतम तारीख देगा।

मान लीजिए, अब आप किसी विशेष कॉलम का डेटा ढूंढना चाहते हैं अधिकतम एकत्रीकरण नही किया जा सकता। सामान्य रूप से, किसी विशेष कॉलम के डेटा को ढूंढने के लिए, आप इसका उपयोग कर सकते हैं GROUP_CONCAT aggregator, कुछ अद्वितीय विभाजक के साथ जो उस कॉलम में मौजूद नहीं हो सकते हैं, जैसे GROUP_CONCAT(string SEPARATOR ' ') as new_column, और जब आप इसे एक्सेस कर रहे हों, तो आप new_column फ़ील्ड को विभाजित / विस्फोट कर सकते हैं।

फिर, यह सबके लिए आवाज नहीं हो सकता है। मैंने इसे किया, और इसे भी पसंद किया क्योंकि मैंने कुछ कार्यों को लिखा था और मैं सबक्वायरी नहीं चला सका। मैं php के लिए codeigniter ढांचे पर काम कर रहा हूँ।

जटिलता के बारे में भी निश्चित नहीं है, हो सकता है कि कोई उस पर कुछ प्रकाश डाल सके।

सादर :)


0
2018-05-17 07:55



मुझे लगता है, मैं यहां उप प्रश्न से बच गया हूं, और कुछ मिनटों में चीजें केवल एक प्रश्न में काम कर सकती हैं। अगर मुझे कुछ याद आती है तो कृपया मुझे सही करें, धन्यवाद! - Satys