2011-12-20 39 views
166

मैं एक MySQL तालिका जो जानकारी निम्न प्रकार के शामिल है से अनन्य मानों का चयन:एक स्तंभ

<?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); 
?> 
:

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

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

यह स्क्रिप्ट तालिका से प्रत्येक दिनांक प्रदर्शित करती है, उदाहरण के लिए

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

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

12.dec.2011 
10.dec.2011 
+0

की संभावित डुप्लिकेट [MySQL अद्वितीय/अलग परिणाम वापस कैसे?] (Http://stackoverflow.com/questions/4663181/mysql-how-to-return-unique-distinct-results) –

उत्तर

318

एक बड़े परिणाम हो रही है MySQL में DISTINCT ऑपरेटर का उपयोग करें:

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

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

40

उपयोग

SELECT DISTINCT Date FROM buy ORDER BY Date 

तो MySQL डुप्लिकेट

को हटा Btw: SELECT में स्पष्ट स्तंभ नाम का उपयोग कर PHP में कम ressources का उपयोग करता है जब आप MySQL

से
+1

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

+0

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

+1

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

19

बाकी है, लगभग सही हैं सिवाय इसके कि वे दिनांक DESC

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

आह हाँ, यह इंगित करने के लिए धन्यवाद। –

26

इस क्वेरी का उपयोग करें द्वारा आदेश मूल्यों

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

मैंने पाया कि यह सहायक नहीं था। मान लें कि आपके पास 5 आइटम हैं, सभी एक ही तारीख 'लेकिन' अलग 'विवरण' के साथ। उपरोक्त आदेश _will_ का उपयोग अलग-अलग 'दिनांक 'दिखाएं, लेकिन केवल पहले आइटम का' विवरण 'मिला। – onebree

6

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

SELECT * FROM buy GROUP BY date,description 
3

एक और DISTINCT जवाब है, लेकिन एक से अधिक मान के साथ:

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

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 Fiddle

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; 
0

एक ही प्राप्त करने के लिए एक विशिष्ट कीवर्ड नहीं है।

SELECT DISTINCT(Date) AS Date 
FROM buy 
ORDER BY Date DESC; 
संबंधित मुद्दे