Auswählen eindeutiger Werte aus einer Spalte


195

Ich habe eine MySQL-Tabelle, die die folgenden Informationen enthält:

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

Hier ist ein Beispiel für ein Skript, mit dem ich Daten aus dieser Tabelle abrufe:

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

Dieses Skript zeigt jedes Datum aus der Tabelle an, z

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

Ich möchte nur eindeutige Daten anzeigen, z

12.dec.2011
10.dec.2011

Antworten:


361

Verwenden Sie den DISTINCT- Operator in MySQL:

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

18
Das unglückliche Problem DISTINCTist, dass nur dieses eine Feld zurückgegeben wird. Wenn Sie also den gesamten Datensatz möchten, ist DISTINCT wertlos (es sei denn, es handelt sich um ein ID-Feld, und Sie können eine zweite Abfrage durchführen, bei der ID in dieser Liste enthalten ist). Gute Nachrichten: Wenn Sie aufgrund eines JOIN mehrere doppelte Ergebnisse haben, können Sie ein GROUP BY durchführen und die vollständigen Ergebnisse filtern lassen.
Chadwick Meyer

1
Das ist nicht richtig Chadwick Meyer! Sie können mehrere Felder auswählen, diese müssen jedoch gruppiert werden. Sie können es so machen: SELECT DISTINCT (Name) AS yourName, id AS yourId FROM Tabelle GROUP BY Name ORDER BY Name. Du wirst überrascht sein !
Lucian Minea

44

verwenden

SELECT DISTINCT Date FROM buy ORDER BY Date

MySQL entfernt also Duplikate

Übrigens: Die Verwendung expliziter Spaltennamen in SELECTverwendet weniger Ressourcen in PHP, wenn Sie ein großes Ergebnis von MySQL erhalten


1
Können Sie "mit expliziten Spaltennamen" erklären? Welcher Weg beansprucht weniger Ressourcen und welcher ist hoch? mit beispiel bitte ein bisschen?
Nabeel Khan

Ein häufiger Anwendungsfall ist das "Streamen" von Daten aus der Datenbank in ein mehrdimensionales Array in PHP. Ihr PHP-Prozess verschwendet also einfach Speicher mit Daten, die Sie möglicherweise nicht benötigen. Für nur einige Datensätze ist dies vernachlässigbar, aber bei der Verarbeitung von Tausenden von Zeilen kann dies einen Unterschied machen.
Rabudde

2
@NabeelKhan anstelle von SELECT * ... verwenden Sie SELECT Spalte 1, Spalte 2 ... es sei denn, Sie benötigen wirklich alle Spalten.
LPChip

@LPChip mit tablename.columnname ist nur gegenüber Spaltenname von Vorteil?
Nabeel Khan

1
@NabeelKhan Sie benötigen nur tablename.columnname, wenn Sie Tabellen verbinden.
LPChip

26

Verwenden Sie diese Abfrage, um Werte abzurufen

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

3
Ich fand, dass dies nicht hilfreich war. Angenommen, Sie haben 5 Artikel, alle gleich, dateaber unterschiedlich description. Wenn Sie den obigen Befehl verwenden, werden verschiedene dates angezeigt, jedoch nur die descriptiondes ersten gefundenen Elements.
Onebree

@onebree - in diesem Fall können Sie tun GROUP BY date,description.
ToolmakerSteve

20

Der Rest ist fast korrekt, außer sie sollten nach Datum DESC bestellen

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

6

DISTINCTist immer die richtige Wahl, um eindeutige Werte zu erhalten. Sie können es auch alternativ tun, ohne es zu verwenden. Das ist GROUP BY. Welches hat einfach am Ende der Abfrage hinzugefügt und gefolgt von dem Spaltennamen.

SELECT * FROM buy GROUP BY date,description

4

Eine andere DISTINCTAntwort, aber mit mehreren Werten:

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

2

Verwenden Sie so etwas, wenn Sie auch Produktdetails pro Datum als JSON ausgeben möchten.

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"}}

Probieren Sie es in SQL Fiddle aus


0

Es gibt ein bestimmtes Schlüsselwort, um dasselbe zu erreichen.

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

0

Kommt darauf an was du brauchst.

In diesem Fall schlage ich vor:

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

weil es nur wenige Felder gibt und die Ausführungszeit von DISTINCTniedriger ist als die Ausführung von GROUP BY.

In anderen Fällen, zum Beispiel wenn es viele Felder gibt, bevorzuge ich:

SELECT * FROM buy GROUP BY date ORDER BY date DESC;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.