wybieranie unikalnych wartości z kolumny

195

Mam tabelę MySQL, która zawiera następujące informacje:

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

Oto przykład skryptu, którego używam do pobierania danych z tej tabeli:

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

Ten skrypt wyświetla każdą datę z tabeli, np

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

Chciałbym wyświetlać tylko unikalne daty, np

12.dec.2011
10.dec.2011
ja i ja
źródło

Odpowiedzi:

361

Użyj operatora DISTINCT w MySQL:

SELECT DISTINCT(Date) AS Date FROM buy ORDER BY Date DESC;
Léon Rodenburg
źródło
18
Niefortunnym problemem DISTINCTjest to, że zwraca tylko to jedno pole ... więc jeśli chcesz cały rekord, DISTINCT jest bezwartościowy (chyba że jest to pole id i możesz zrobić drugie zapytanie, gdzie id na tej liście). Dobra wiadomość, jeśli jednak masz wiele zduplikowanych wyników w wyniku JOIN, możesz wykonać GROUP BY i przefiltrować pełne wyniki.
Chadwick Meyer,
1
To nie jest poprawne Chadwick Meyer! Możesz wybrać wiele pól, ale musisz je zgrupować. Możesz to zrobić w następujący sposób: WYBIERZ ODLEGŁOŚĆ (nazwa) JAK twoja nazwa, id JAK twoja nazwa Z tabeli GRUPUJ NAZWA ORDER BY nazwa. Będziesz zaskoczony!
Lucian Minea
43

posługiwać się

SELECT DISTINCT Date FROM buy ORDER BY Date

więc MySQL usuwa duplikaty

BTW: użycie jawnych nazw kolumn SELECTw PHP zużywa mniej zasobów, gdy otrzymujesz duży wynik z MySQL

rabudde
źródło
1
czy możesz wyjaśnić „używając jednoznacznych nazw kolumn”? w jaki sposób zużycie zasobów jest mniejsze, a które wysokie? z przykładem trochę proszę?
Nabeel Khan
Typowym przykładem użycia jest „przesyłanie strumieniowe” danych z bazy danych do wielowymiarowej tablicy w PHP; więc proces PHP po prostu marnuje pamięć na dane, których możesz nie potrzebować. W przypadku tylko niektórych zestawów danych jest to nieistotne, ale przy obsłudze tysięcy wierszy może to mieć znaczenie.
rabudde
2
@NabeelKhan zamiast używać SELECT * ... użyj SELECT kolumna 1, kolumna 2 ... Chyba że naprawdę potrzebujesz wszystkich kolumn.
LPChip
@LPChip przy użyciu tablename.columnname ma przewagę nad samą nazwą kolumny?
Nabeel Khan
1
@NabeelKhan potrzebujesz tylko tablename.columnname, kiedy dołączasz do tabel.
LPChip
26

Użyj tego zapytania, aby uzyskać wartości

SELECT * FROM `buy` group by date order by date DESC
Jan
źródło
3
Odkryłem, że to nie było pomocne. Powiedzmy, że masz 5 przedmiotów, wszystkie o tym samym, dateale innym description. Korzystając z powyższego polecenia będzie pokazać różne dates, ale tylko descriptionz pierwszej pozycji znalazł.
onebree
@onebree - w takim przypadku możesz to zrobić GROUP BY date,description.
ToolmakerSteve,
19

Reszta jest prawie poprawna, z wyjątkiem tego, że powinny zamówić według daty DESC

SELECT DISTINCT(Date) AS Date FROM buy ORDER BY Date DESC;
ajreal
źródło
6

DISTINCTjest zawsze właściwym wyborem, aby uzyskać unikalne wartości. Możesz także zrobić to na przemian bez użycia. To GROUP BY. Który po prostu dodaje na końcu zapytania, a po nim następuje nazwa kolumny.

SELECT * FROM buy GROUP BY date,description
Kwaradha
źródło
4

Inna DISTINCTodpowiedź, ale z wieloma wartościami:

SELECT DISTINCT `field1`, `field2`, `field3` FROM `some_table`  WHERE `some_field` > 5000 ORDER BY `some_field`
CONvid19
źródło
2

Użyj czegoś takiego w przypadku, gdy chcesz również wyświetlać szczegółowe informacje o produktach według daty jako 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"}}

Wypróbuj w SQL Fiddle

Peter Darmis
źródło
0

Istnieje konkretne słowo kluczowe do osiągnięcia tego samego.

SELECT DISTINCT( Date ) AS Date 
FROM   buy 
ORDER  BY Date DESC; 
Ashutosh dwivedi
źródło
0

Zależy od tego, czego potrzebujesz.

W takim przypadku sugeruję:

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

ponieważ jest niewiele pól, a czas wykonania DISTINCTjest krótszy niż wykonanie GROUP BY.

W innych przypadkach, na przykład, gdy jest wiele pól, wolę:

SELECT * FROM buy GROUP BY date ORDER BY date DESC;
Marco Desposito
źródło