2011-12-20 31 views
166

Tengo una tabla de MySQL que contiene los siguientes tipos de información:seleccionar valores únicos de una columna

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

Aquí está un ejemplo de un script que utilizo 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 cada fecha de la tabla, por ejemplo

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

Me gustaría mostrar solamente las fechas únicas, p.

12.dec.2011 
10.dec.2011 
+0

duplicado posible de [MySQL Cómo devolver únicos/distintos resultados?] (Http://stackoverflow.com/questions/4663181/mysql-how-to-return-unique-distinct-results) –

Respuesta

318

Use el operador DISTINCT en MySQL:

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

El desafortunado problema de 'DISTINCT' es que solo devuelve ese campo ... por lo 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 ID IN que lista). Buenas noticias, sin embargo, si tiene múltiples resultados duplicados como resultado de un JOIN, puede hacer un GROUP BY y obtener los resultados completos filtrados. –

40

uso

SELECT DISTINCT Date FROM buy ORDER BY Date 

por lo MySQL elimina duplicados

Por cierto: el uso de nombres de columna explícitos en SELECT utiliza menos Recursos en PHP cuando se está obteniendo un gran resultado de MySQL

+1

puede usted explicar "usar nombres de columna explícitos"? ¿Qué camino toma menos recursos y cuál es más alto? con un poco de ejemplo, por favor? –

+0

El caso de uso común es "transmitir" datos de una base de datos a una matriz multidimensional en PHP; entonces su proceso de PHP simplemente desperdicia memoria con datos que quizás no necesite. Para algunos conjuntos de datos, esto es insignificante, pero cuando se manejan miles de filas, esto podría marcar la diferencia. – rabudde

+1

@NabeelKhan en lugar de usar SELECT * ... use SELECT columna 1, columna 2 ... A menos que realmente necesite todas las columnas. – LPChip

19

El resto son casi correcta, si no se deben ordenar por fecha DESC

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

Ah sí, gracias por señalar eso. –

26

Utilice esta consulta para obtener los valores

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

Descubrí que esto no fue útil. Supongamos que tiene 5 elementos, todos con la misma 'fecha' pero diferente' descripción'. Usando el comando anterior, _will_ mostrará 'date's, pero solo' description' del primer elemento encontrado. – onebree

6

DISTINCT es siempre una elección correcta para obtener valores únicos. También puedes hacerlo alternativamente sin usarlo. Eso es GROUP BY. Que simplemente tiene que agregar al final de la consulta y seguido por el nombre de la columna.

SELECT * FROM buy GROUP BY date,description 
3

Otra DISTINCT respuesta, pero con múltiples valores:

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

usar algo como esto en caso de que también quiere productos de salida de datos 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ébalo en SQL Fiddle

0

Depende de lo que necesita.

En este caso, propongo:

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

porque hay pocos campos y el tiempo de ejecución de DISTINCT es más baja que la ejecución de GROUP BY.

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

SELECT * FROM buy GROUP BY date ORDER BY date DESC; 
0

No es una palabra clave específica para el logro de la misma.

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