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

Respuestas:


362

Use el operador DISTINCT en MySQL:

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

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


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

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;

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

4

Otra DISTINCTrespuesta, pero con múltiples valores:

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

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


0

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

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

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;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.