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

Réponses:


362

Utilisez l' opérateur DISTINCT dans MySQL:

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

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


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

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;

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

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`

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


0

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

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

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;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.