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.