selezionando valori univoci da una colonna


196

Ho una tabella MySQL che contiene il seguente tipo di informazioni:

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

Ecco un esempio di uno script che utilizzo per ottenere dati da questa tabella:

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

Questo script visualizza ogni data dalla tabella, ad es

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

Vorrei visualizzare solo date uniche, ad es

12.dec.2011
10.dec.2011

Risposte:


362

Utilizzare l' operatore DISTINCT in MySQL:

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

18
Lo sfortunato problema di DISTINCTè che restituisce solo quel campo ... quindi se vuoi l'intero record, DISTINCT è inutile (a meno che non sia un campo ID, e puoi fare una seconda query dove ID in quell'elenco). Buone notizie, tuttavia, se si ottengono più risultati duplicati a seguito di un JOIN, è possibile eseguire GROUP GROUP e filtrare i risultati completi.
Chadwick Meyer,

1
Non è corretto Chadwick Meyer! Puoi scegliere più campi, ma devi raggrupparli. Puoi farlo in questo modo: SELEZIONA DISTINCT (nome) COME tuoNome, ID come tuoId dalla tabella GRUPPO PER nome ORDINA PER nome. Sarai sorpreso!
Lucian Minea,

44

uso

SELECT DISTINCT Date FROM buy ORDER BY Date

quindi MySQL rimuove i duplicati

A proposito: l'utilizzo di nomi di colonna espliciti in SELECTutilizza meno risorse in PHP quando si ottiene un grande risultato da MySQL


1
puoi spiegare "usando nomi espliciti di colonna"? in che modo è meno il consumo di risorse e quale è alto? con esempio un po 'per favore?
Nabeel Khan,

Il caso d'uso comune è "trasmettere" i dati dal database all'array multidimensionale in PHP; quindi il tuo processo PHP semplicemente spreca memoria con dati che potrebbero non essere necessari. Solo per alcuni set di dati questo è trascurabile, ma quando si gestiscono migliaia di righe, ciò potrebbe fare la differenza.
rabudde,

2
@NabeelKhan invece di usare SELECT * ... usa SELECT colonna 1, colonna 2 ... A meno che tu non abbia davvero bisogno di tutte le colonne.
LPChip,

@LPChip utilizzando tablename.columnname è utile solo su nomecolonna?
Nabeel Khan,

1
@NabeelKhan hai solo bisogno di tablename.columnname quando ti unisci alle tabelle.
LPChip,

26

Utilizzare questa query per ottenere valori

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

3
Ho scoperto che questo non è stato utile. Supponi di avere 5 articoli, tutti uguali datema diversi description. Utilizzando il comando precedente si mostra distinti dates, ma solo la descriptiondel primo elemento trovato.
onebree,

@onebree - in tal caso, puoi farlo GROUP BY date,description.
ToolmakerSteve

20

Il resto è quasi corretto, tranne per il fatto che dovrebbero ordinare per data DESC

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

6

DISTINCTè sempre la scelta giusta per ottenere valori unici. Inoltre puoi farlo in alternativa senza usarlo. Questo è GROUP BY. Che ha semplicemente aggiunto alla fine della query e seguito dal nome della colonna.

SELECT * FROM buy GROUP BY date,description

4

Un'altra DISTINCTrisposta, ma con più valori:

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

2

Utilizzare qualcosa del genere nel caso in cui si desideri anche visualizzare i dettagli dei prodotti per data come 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"}}

Provalo in SQL Fiddle


0

Esiste una parola chiave specifica per raggiungere lo stesso.

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

0

Dipende da ciò di cui hai bisogno.

In questo caso suggerisco:

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

perché ci sono pochi campi e il tempo di esecuzione di DISTINCTè inferiore all'esecuzione di GROUP BY.

In altri casi, ad esempio dove ci sono molti campi, preferisco:

SELECT * FROM buy GROUP BY date ORDER BY date DESC;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.