web-dev-qa-db-fra.com

sélectionner des valeurs uniques dans une colonne

J'ai une table MySQL qui contient le type d'informations suivant:

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

Voici un exemple de script que j'utilise pour extraire des données de cette table:

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

Ce script affiche chaque date de la table, par exemple.

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

Je souhaite uniquement afficher des dates uniques, par exemple.

12.dec.2011
10.dec.2011
183
meandme

Utilisez l'opérateur DISTINCT dans MySQL:

SELECT DISTINCT(Date) AS Date FROM buy ORDER BY Date DESC;
345
Léon Rodenburg

utilisation

SELECT DISTINCT Date FROM buy ORDER BY Date

alors MySQL supprime les doublons

BTW: utiliser des noms de colonne explicites dans SELECT utilise moins de ressources dans PHP lorsque vous obtenez un résultat volumineux de MySQL

42
rabudde

Utilisez cette requête pour obtenir des valeurs

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

Le reste est presque correct, sauf qu'ils devraient commander par Date DESC

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

DISTINCT est toujours un bon choix pour obtenir des valeurs uniques. Aussi, vous pouvez le faire alternativement sans l'utiliser. C'est GROUP BY. Ce qui a simplement ajouté à la fin de la requête et suivi du nom de la colonne.

SELECT * FROM buy GROUP BY date,description
6
Kvvaradha

Une autre réponse DISTINCT, mais avec plusieurs valeurs:

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

Utilisez quelque chose comme ceci au cas où vous souhaiteriez également générer des détails de produits par date au format 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"}}

Essayez-le dans SQL Fiddle

2
Peter Darmis

Il existe un mot clé spécifique pour atteindre le même objectif.

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

Dépend de ce dont vous avez besoin.

Dans ce cas, je suggère:

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

car il y a peu de champs et que le temps d'exécution de DISTINCT est inférieur à l'exécution de GROUP BY.

Dans d'autres cas, par exemple où il y a beaucoup de champs, je préfère:

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