एक कॉलम से अद्वितीय मानों का चयन करना


195

मेरे पास एक MySQL टेबल है जिसमें निम्न प्रकार की जानकारी है:

    Date            product 
2011-12-12           azd
2011-12-12           yxm
2011-12-10           sdx
2011-12-10           ssdd  

इस तालिका से डेटा प्राप्त करने के लिए मेरे द्वारा उपयोग की जाने वाली स्क्रिप्ट का एक उदाहरण है:

<?php

$con = mysql_connect("localhost","username","password");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }
mysql_select_db("db", $con);
$sql=mysql_query("SELECT * FROM buy ORDER BY Date");
while($row = mysql_fetch_array($sql))
{

 echo "<li><a href='http://www.website/". $row['Date'].".html'>buy ". date("j, M Y", strtotime($row["Date"]))."</a></li>";

    }
    mysql_close($con);
?> 

यह स्क्रिप्ट तालिका से हर तारीख को प्रदर्शित करती है, जैसे

12.dec 2011
12.dec.2011
10.dec.2011
10.dec.2011

मैं केवल अनन्य तिथियां प्रदर्शित करना चाहूंगा, उदा

12.dec.2011
10.dec.2011

जवाबों:


361

MySQL में DISTINCT ऑपरेटर का उपयोग करें :

SELECT DISTINCT(Date) AS Date FROM buy ORDER BY Date DESC;

18
दुर्भाग्यपूर्ण समस्या DISTINCTयह है कि यह केवल उस एक फ़ील्ड को लौटाता है ... इसलिए यदि आप संपूर्ण रिकॉर्ड चाहते हैं, तो DISTINCT बेकार है (जब तक कि यह एक आईडी फ़ील्ड नहीं है, और आप उस सूची में एक दूसरा क्वेरी कर सकते हैं जहाँ id है)। अच्छी खबर है, हालांकि, यदि आपके पास एक JOIN के परिणामस्वरूप कई डुप्लिकेट परिणाम हैं, तो आप एक GROUP BY कर सकते हैं और पूर्ण परिणाम फ़िल्टर कर सकते हैं।
चाडविक मेयर

1
यह सही नहीं है चाडविक मेयर! आप कई फ़ील्ड चुन सकते हैं, लेकिन आपको उन्हें समूहीकृत करना होगा। आप इसे इस तरह से बना सकते हैं: SELIST DISTINCT (नाम) AS yourName, id as yourId FROM table GROUP BY ORDER BY नाम से। आपको आश्चर्य होगा!
लूसियन मिनिया

43

उपयोग

SELECT DISTINCT Date FROM buy ORDER BY Date

इसलिए MySQL डुप्लिकेट हटाता है

BTW: SELECTजब आप MySQL से एक बड़ा परिणाम प्राप्त कर रहे हैं, तो PHP में कम संसाधनों का उपयोग करते हुए स्पष्ट स्तंभ नामों का उपयोग करना


1
क्या आप "स्पष्ट स्तंभ नामों का उपयोग" समझा सकते हैं? कौन सा तरीका कम संसाधन ले रहा है और कौन सा उच्च है? उदाहरण के लिए थोड़ा सा?
नबील खान

सामान्य उपयोग मामला PHP में बहुआयामी सरणी में डेटाबेस से डेटा "स्ट्रीम" करने के लिए है; इसलिए आपकी PHP प्रक्रिया केवल डेटा के साथ मेमोरी बर्बाद करती है जिसकी आपको आवश्यकता नहीं हो सकती है। केवल कुछ डेटासेट के लिए यह नगण्य है, लेकिन जब हजारों पंक्तियों को संभालते हैं, तो इससे फर्क पड़ सकता है।
रबडडे

2
@NeeleelKhan के बजाय SELECT * ... का उपयोग करें SELECT कॉलम 1, कॉलम 2 ... जब तक आपको वास्तव में सभी कॉलम की आवश्यकता न हो।
LPChip

Tablename.columnname का उपयोग कर @LPChip केवल स्तंभ नाम से अधिक फायदेमंद है?
नबील खान

1
जब आप तालिकाओं में शामिल होते हैं तो @NabeelKhan आपको केवल tablename.columnname की आवश्यकता होती है।
LPChip

26

मान प्राप्त करने के लिए इस क्वेरी का उपयोग करें

SELECT * FROM `buy` group by date order by date DESC

3
मैंने पाया कि यह मददगार नहीं था। मान लें कि आपके पास 5 आइटम हैं, सभी समान dateलेकिन अलग हैं description। उपरोक्त कमांड का उपयोग करने से अलग-अलग एस दिखाई देंगेdate , लेकिन केवल descriptionपहले आइटम का पाया गया।
वनबरी

@onebree - उस स्थिति में, आप कर सकते हैं GROUP BY date,description
टूलमेकरसेव

19

बाकी लगभग सही हैं, सिवाय इसके कि उन्हें डेट डीईएससी को ऑर्डर करना चाहिए

SELECT DISTINCT(Date) AS Date FROM buy ORDER BY Date DESC;

6

DISTINCTअद्वितीय मान प्राप्त करने के लिए हमेशा एक सही विकल्प होता है। इसके अलावा आप इसे वैकल्पिक रूप से उपयोग किए बिना कर सकते हैं। वह है GROUP BY। जो केवल क्वेरी के अंत में जोड़ा गया है और कॉलम नाम के बाद है।

SELECT * FROM buy GROUP BY date,description

4

एक और DISTINCTजवाब, लेकिन कई मूल्यों के साथ:

SELECT DISTINCT `field1`, `field2`, `field3` FROM `some_table`  WHERE `some_field` > 5000 ORDER BY `some_field`

2

इस तरह से कुछ का उपयोग करें यदि आप भी JSON के रूप में प्रति माह उत्पादों के विवरण का उत्पादन करना चाहते हैं।

SELECT `date`,
CONCAT('{',GROUP_CONCAT('{\"id\": \"',`product_id`,'\",\"name\": \"',`product_name`,'\"}'),'}') as `productsJSON`
FROM `buy` group by `date` 
order by `date` DESC

 product_id product_name     date  
|    1     |     azd    | 2011-12-12 |
|    2     |     xyz    | 2011-12-12 |
|    3     |     ase    | 2011-12-11 |
|    4     |     azwed  | 2011-12-11 |
|    5     |     wed    | 2011-12-10 |
|    6     |     cvg    | 2011-12-10 |
|    7     |     cvig   | 2011-12-09 |

RESULT
       date                                productsJSON
2011-12-12T00:00:00Z    {{"id": "1","name": "azd"},{"id": "2","name": "xyz"}}
2011-12-11T00:00:00Z    {{"id": "3","name": "ase"},{"id": "4","name": "azwed"}}
2011-12-10T00:00:00Z    {{"id": "5","name": "wed"},{"id": "6","name": "cvg"}}
2011-12-09T00:00:00Z    {{"id": "7","name": "cvig"}}

SQL फिडेल में इसे आज़माएं



0

आप की जरूरत पर निर्भर करता है

इस मामले में मेरा सुझाव है:

SELECT DISTINCT(Date) AS Date FROM buy ORDER BY Date DESC;

क्योंकि कुछ क्षेत्र हैं और निष्पादन का समय निष्पादन DISTINCTसे कम है GROUP BY

अन्य मामलों में, उदाहरण के लिए जहां कई क्षेत्र हैं, मैं पसंद करता हूं:

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