sélection de valeurs uniques dans une colonne

196

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 obtenir 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 du tableau, par exemple

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

Je souhaite afficher uniquement des dates uniques, par exemple

12.dec.2011
10.dec.2011
moi et moi
la source

Réponses:

362

Utilisez l' opérateur DISTINCT dans MySQL:

SELECT DISTINCT(Date) AS Date FROM buy ORDER BY Date DESC;
Léon Rodenburg
la source
18
Le malheureux problème DISTINCTest qu'il ne renvoie que ce seul champ ... donc si vous voulez tout l'enregistrement, le DISTINCT ne vaut rien (sauf s'il s'agit d'un champ id, et vous pouvez faire une deuxième requête où id IN dans cette liste). Bonne nouvelle, cependant, si vous avez plusieurs résultats en double à la suite d'un JOIN, vous pouvez faire un GROUP BY et filtrer les résultats complets.
Chadwick Meyer
1
Ce n'est pas correct Chadwick Meyer! Vous pouvez choisir plusieurs champs, mais vous devez les regrouper. Vous pouvez le faire comme ceci: SELECT DISTINCT (name) AS yourName, id AS yourId FROM table GROUP BY name ORDER BY name. Vous serez surpris!
Lucian Minea
44

utilisation

SELECT DISTINCT Date FROM buy ORDER BY Date

donc MySQL supprime les doublons

BTW: l'utilisation de noms de colonnes explicites dans SELECTutilise moins de ressources en PHP lorsque vous obtenez un résultat volumineux de MySQL

rabudde
la source
1
pouvez-vous expliquer "en utilisant des noms de colonnes explicites"? de quelle manière la consommation de ressources est-elle moindre et laquelle est élevée? par exemple un peu s'il vous plait?
Nabeel Khan
Le cas d'utilisation courant consiste à «diffuser» les données de la base de données dans un tableau multidimensionnel en PHP; de sorte que votre processus PHP gaspille simplement de la mémoire avec des données dont vous pourriez ne pas avoir besoin. Pour certains jeux de données uniquement, cela est négligeable, mais lors de la gestion de milliers de lignes, cela peut faire la différence.
rabudde
2
@NabeelKhan au lieu d'utiliser SELECT * ... utilisez SELECT colonne 1, colonne 2 ... Sauf si vous avez vraiment besoin de toutes les colonnes.
LPChip
@LPChip utilisant tablename.columnname est bénéfique par rapport à seulement columnname?
Nabeel Khan
1
@NabeelKhan vous n'avez besoin de tablename.columnname que lorsque vous joignez des tables.
LPChip
26

Utilisez cette requête pour obtenir des valeurs

SELECT * FROM `buy` group by date order by date DESC
John
la source
3
J'ai trouvé que ce n'était pas utile. Supposons que vous ayez 5 articles, tous identiques datemais différents description. En utilisant la commande ci - dessus va montrer distinctes dates, mais seulement descriptiondu premier article trouvé.
onebree
@onebree - dans ce cas, vous pouvez le faire GROUP BY date,description.
ToolmakerSteve
20

Les autres sont presque corrects, sauf qu'ils doivent être classés par Date DESC

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

DISTINCTest toujours un bon choix pour obtenir des valeurs uniques. Vous pouvez également le faire alternativement sans l'utiliser. Voilà GROUP BY. Qui a simplement ajouté à la fin de la requête et suivi du nom de la colonne.

SELECT * FROM buy GROUP BY date,description
Kvvaradha
la source
4

Une autre DISTINCTréponse, mais avec plusieurs valeurs:

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

Utilisez quelque chose comme ceci au cas où vous souhaiteriez également afficher les détails des 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

Peter Darmis
la source
0

Il existe un mot-clé spécifique pour y parvenir.

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

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 le temps d'exécution de DISTINCTest inférieur à celui 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;
Marco Desposito
la source