MySQL: सबसे हालिया रिकॉर्ड प्राप्त करें


80

नीचे दी गई तालिका में, मुझे साइनइन कॉलम के आधार पर सिर्फ सबसे हालिया रिकॉर्ड कैसे मिलेगा id=1और सभी 3 रिकॉर्ड नहीं?

+----+---------------------+---------+
| id | signin              | signout |
+----+---------------------+---------+
|  1 | 2011-12-12 09:27:24 | NULL    |
|  1 | 2011-12-13 09:27:31 | NULL    |
|  1 | 2011-12-14 09:27:34 | NULL    |
|  2 | 2011-12-14 09:28:21 | NULL    |
+----+---------------------+---------+

जवाबों:


90

MAX(signin)आईडी द्वारा समूहीकृत समूह का उपयोग करें । यह signinप्रत्येक के लिए सबसे हाल ही में सूचीबद्ध करेगा id

SELECT 
 id, 
 MAX(signin) AS most_recent_signin
FROM tbl
GROUP BY id

पूरे एकल रिकॉर्ड को प्राप्त करने के लिए, INNER JOINएक उपश्रेणी के खिलाफ प्रदर्शन करें जो केवल MAX(signin)प्रति आईडी देता है।

SELECT 
  tbl.id,
  signin,
  signout
FROM tbl
  INNER JOIN (
    SELECT id, MAX(signin) AS maxsign FROM tbl GROUP BY id
  ) ms ON tbl.id = ms.id AND signin = maxsign
WHERE tbl.id=1

यहाँ अपने के आधार पर काम किया है पहले : इस सवाल का जवाबSELECT id, MAX(signin) FROM tbl GROUP BY id WHERE id=1;
ENCHANCE

मैंने अपनी स्थिति पर दूसरा समाधान (पूरी पंक्ति प्राप्त करने के लिए) लागू करने की कोशिश की, लेकिन मुझे हमेशा एक खाली परिणाम सेट मिलता है
ranth

@antsh xQbert के उत्तर का मूल संस्करण जो मेरे पास था, उसका सही संस्करण था, लेकिन मैं उस समाधान को पसंद करता हूं जिसे मैंने अभी बदल दिया है।
माइकल बेर्कोव्स्की

@MichaelBerkowski का मतलब है कि आप मेरा समाधान पसंद करते हैं? अगर मेरे मामले में मेरे जवाब पर कोई
उठापटक नहीं होती

1
@ तिरछी आह, मैंने ध्यान नहीं दिया था कि आपने एक समान चीज़ जोड़ दी थी, जिसे मैंने केवल संशोधित किया था, USINGएक स्पष्ट के बजाय ON। आपको
माइकल बर्कोव्स्की

83
SELECT *
FROM   tbl
WHERE  id = 1
ORDER  BY signin DESC
LIMIT  1;

स्पष्ट सूचकांक पर होगा (id), या एक बहुरंगी सूचकांक पर होगा (id, signin DESC)

मामले के लिए, MySQL NULLमानों को अवरोही क्रम में अंतिम रूप देता है। यदि आप आमतौर पर चाहते हैं कि क्या NULLमान हो सकते हैं: नवीनतम नॉट-नल वाली पंक्ति signin

NULLपहले मान प्राप्त करने के लिए :

ORDER BY signin IS NOT NULL, signin DESC

सम्बंधित:

SQL मानक स्पष्ट रूप से NULLमानों के लिए एक डिफ़ॉल्ट सॉर्ट क्रम को परिभाषित नहीं करता है । विभिन्न आरडीबीएमएस में व्यवहार काफी भिन्न होता है। देख:

लेकिन वहाँ रहे हैंNULLS FIRST / NULLS LASTखंड सबसे प्रमुख आरडीबीएमएस द्वारा एसक्यूएल मानक में परिभाषित और समर्थन किया, लेकिन MySQL द्वारा नहीं। देख:


5
यह ऐसा करने का सबसे साफ तरीका लगता है!
कर्णन


अंतिम पंक्ति का उपयोग करें SELECT TOP 1 *और निकालें LIMIT 1। अगर SQL Server का उपयोग कर रहे हैं। यदि MySQL या Postgres ऊपर का उपयोग करें।
jaredbaszler

सबसे साफ। । । । । । । ।
18

सरल और साफ!
जेरेमी स्वैगर

9

@ XQbert's के उत्तर पर बिल्डिंग, आप सबक्वेरी से बच सकते हैं और किसी भी आईडी से फ़िल्टर करने के लिए इसे सामान्य बना सकते हैं

SELECT id, signin, signout
FROM dTable
INNER JOIN(
  SELECT id, MAX(signin) AS signin
  FROM dTable
  GROUP BY id
) AS t1 USING(id, signin)

नमस्ते यह क्वेरी कैसे काम करती है और क्या यह xQbert के उत्तर से अधिक कुशल है? दोनों प्रश्न मेरे लिए लगभग एक ही समय पर चलते हैं और मुझे यह समझ में नहीं आता है कि क्वेरी का उपयोग करने वाले हिस्से की जगह आमतौर पर क्या है।
ZJS

3
Select [insert your fields here]
from tablename 
where signin = (select max(signin) from tablename where ID = 1)


1

मुझे भी ऐसी ही समस्या का समाधान करना पड़ा था। मुझे पृष्ठ सामग्री अनुवाद के अंतिम संस्करण को दूसरे शब्दों में प्राप्त करने की आवश्यकता थी - उस विशिष्ट रिकॉर्ड को प्राप्त करने के लिए जिसमें संस्करण कॉलम में सबसे अधिक संख्या है। इसलिए मैं संस्करण द्वारा ऑर्डर किए गए सभी रिकॉर्ड का चयन करता हूं और फिर परिणाम से पहली पंक्ति लेता हूं (लिमिट क्लॉज का उपयोग करके)।

SELECT *
FROM `page_contents_translations`
ORDER BY version DESC
LIMIT 1

1

प्राप्त करने का सरल तरीका

मुझे पता है कि यह एक पुराना सवाल है। आप भी कुछ ऐसा कर सकते हैं

SELECT * FROM Table WHERE id=1 ORDER BY signin DESC

ऊपर, क्वेरी पहले रिकॉर्ड सबसे हालिया रिकॉर्ड होगा।

केवल एक रिकॉर्ड के लिए आप कुछ का उपयोग कर सकते हैं

SELECT top(1) * FROM Table WHERE id=1 ORDER BY signin DESC

उपरोक्त क्वेरी केवल एक नवीनतम रिकॉर्ड लौटाएगी।

चियर्स!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.