seleccionar valores únicos de una columna

196

Tengo una tabla MySQL que contiene el siguiente tipo de información:

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

Aquí hay un ejemplo de un script que uso para obtener datos de esta tabla:

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

Este script muestra todas las fechas de la tabla, p. Ej.

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

Me gustaría mostrar solo fechas únicas, p. Ej.

12.dec.2011
10.dec.2011
yo y yo
fuente

Respuestas:

362

Use el operador DISTINCT en MySQL:

SELECT DISTINCT(Date) AS Date FROM buy ORDER BY Date DESC;
Léon Rodenburg
fuente
18
El desafortunado problema DISTINCTes que solo devuelve ese campo ... así que si desea el registro completo, DISTINCT no tiene valor (a menos que sea un campo de identificación, y puede hacer una segunda consulta donde identifique en esa lista). Sin embargo, buenas noticias, si tiene múltiples resultados duplicados como resultado de UNIRSE, puede hacer un GROUP BY y obtener los resultados completos filtrados.
Chadwick Meyer
1
Eso no es correcto Chadwick Meyer! Puede elegir múltiples campos, pero debe agruparlos. Puede hacerlo así: SELECCIONE DISTINCT (nombre) COMO yourName, id AS yourId FROM table GROUP BY name ORDER BY name. ¡Te sorprenderás!
Lucian Minea
44

utilizar

SELECT DISTINCT Date FROM buy ORDER BY Date

entonces MySQL elimina duplicados

Por cierto: el uso de nombres de columna explícitos SELECTusa menos recursos en PHP cuando obtiene un gran resultado de MySQL

rabudde
fuente
1
¿Puedes explicar "usar nombres de columna explícitos"? ¿De qué manera se toman menos recursos y cuál es alta? con ejemplo un poco por favor?
Nabeel Khan
El caso de uso común es "transmitir" datos de la base de datos a una matriz multidimensional en PHP; entonces su proceso PHP simplemente desperdicia memoria con datos que quizás no necesite. Para solo algunos conjuntos de datos, esto es insignificante, pero cuando se manejan miles de filas, esto podría marcar la diferencia.
rabudde
2
@NabeelKhan en lugar de usar SELECT * ... use SELECT columna 1, columna 2 ... A menos que realmente necesite todas las columnas.
LPChip
@LPChip usando tablename.columnname es beneficioso solo sobre columnname?
Nabeel Khan
1
@NabeelKhan solo necesita tablename.columnname cuando se une a las tablas.
LPChip
26

Use esta consulta para obtener valores

SELECT * FROM `buy` group by date order by date DESC
Juan
fuente
3
Descubrí que esto no fue útil. Digamos que tiene 5 artículos, todos con el mismo datepero diferente description. Usando el comando anterior se muestran distintas dates, pero sólo la descriptiondel primer elemento encontrado.
onebree
@onebree: en ese caso, puedes hacerlo GROUP BY date,description.
ToolmakerSteve
20

El resto son casi correctos, excepto que deben ordenar por Fecha DESC

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

DISTINCTSiempre es una opción correcta para obtener valores únicos. También puedes hacerlo alternativamente sin usarlo. Eso es GROUP BY. Que simplemente se agrega al final de la consulta y seguido por el nombre de la columna.

SELECT * FROM buy GROUP BY date,description
Kvvaradha
fuente
4

Otra DISTINCTrespuesta, pero con múltiples valores:

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

Use algo como esto en caso de que también desee generar detalles de productos por fecha como 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"}}

Pruébelo en SQL Fiddle

Peter Darmis
fuente
0

Hay una palabra clave específica para lograr lo mismo.

SELECT DISTINCT( Date ) AS Date 
FROM   buy 
ORDER  BY Date DESC; 
Ashutosh dwivedi
fuente
0

Depende de lo que necesites.

En este caso sugiero:

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

porque hay pocos campos y el tiempo de ejecución de DISTINCTes menor que la ejecución de GROUP BY.

En otros casos, por ejemplo, donde hay muchos campos, prefiero:

SELECT * FROM buy GROUP BY date ORDER BY date DESC;
Marco Desposito
fuente