memilih nilai unik dari kolom

196

Saya memiliki tabel MySQL yang berisi jenis informasi berikut:

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

Berikut ini contoh skrip yang saya gunakan untuk mendapatkan data dari tabel ini:

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

Script ini menampilkan setiap tanggal dari tabel, mis

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

Saya hanya ingin menampilkan tanggal unik, mis

12.dec.2011
10.dec.2011
aku dan aku
sumber
Kemungkinan rangkap dari MySQL Bagaimana Mengembalikan Hasil Unik / Berbeda?
Jim Fell

Jawaban:

362

Gunakan operator DISTINCT di MySQL:

SELECT DISTINCT(Date) AS Date FROM buy ORDER BY Date DESC;
Léon Rodenburg
sumber
18
Masalah yang disayangkan DISTINCTadalah hanya mengembalikan satu bidang itu ... jadi jika Anda ingin seluruh catatan, DISTINCT tidak bernilai (kecuali jika itu adalah bidang id, dan Anda dapat melakukan kueri kedua di mana id DALAM daftar itu). Kabar baiknya, jika Anda memiliki beberapa hasil duplikat sebagai hasil dari GABUNGAN, Anda dapat melakukan GROUP BY dan mendapatkan hasil lengkap yang difilter.
Chadwick Meyer
1
Itu tidak benar Chadwick Meyer! Anda dapat memilih beberapa bidang, tetapi Anda harus mengelompokkannya. Anda dapat menjadikannya seperti ini: PILIH PERBEDAAN (nama) SEBAGAI NamaAnda, id SEBAGAI ID Anda DARI tabel GROUP DENGAN nama PESANAN DENGAN nama. Anda akan terkejut!
Lucian Minea
44

menggunakan

SELECT DISTINCT Date FROM buy ORDER BY Date

jadi MySQL menghapus duplikat

BTW: menggunakan nama kolom eksplisit dalam SELECTmenggunakan lebih sedikit sumber daya di PHP ketika Anda mendapatkan hasil besar dari MySQL

rabudde
sumber
1
dapatkah Anda menjelaskan "menggunakan nama kolom eksplisit"? mana yang mengambil sumber daya lebih sedikit dan mana yang tinggi? dengan contoh sedikit tolong?
Nabeel Khan
Kasing yang umum digunakan adalah "mengalirkan" data dari database ke dalam array multidimensi dalam PHP; jadi proses PHP Anda hanya menghabiskan memori dengan data yang mungkin tidak Anda butuhkan. Untuk hanya beberapa set data, ini dapat diabaikan, tetapi ketika menangani ribuan baris, ini dapat membuat perbedaan.
rabudde
2
@NabeelKhan alih-alih menggunakan SELECT * ... gunakan SELECT kolom 1, kolom 2 ... Kecuali Anda benar-benar membutuhkan semua kolom.
LPChip
@LPChip menggunakan tablename.columnname hanya bermanfaat di atas nama kolom saja?
Nabeel Khan
1
@NabeelKhan Anda hanya perlu tablename.columnname saat Anda bergabung dengan tabel.
LPChip
26

Gunakan kueri ini untuk mendapatkan nilai

SELECT * FROM `buy` group by date order by date DESC
John
sumber
3
Saya menemukan bahwa ini tidak membantu. Katakanlah Anda memiliki 5 item, semuanya dengan yang sama datetetapi berbeda description. Menggunakan perintah di atas akan menunjukkan perbedaan date, tetapi hanya descriptionitem pertama yang ditemukan.
onebree
@ onebree - dalam hal ini, Anda bisa melakukannya GROUP BY date,description.
ToolmakerSteve
20

Sisanya hampir benar, kecuali mereka harus memesan dengan DESC Tanggal

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

DISTINCTselalu merupakan pilihan yang tepat untuk mendapatkan nilai unik. Anda juga dapat melakukannya secara alternatif tanpa menggunakannya. Itu GROUP BY. Yang hanya menambahkan di akhir kueri dan diikuti oleh nama kolom.

SELECT * FROM buy GROUP BY date,description
Kvvaradha
sumber
4

DISTINCTJawaban lain , tetapi dengan beberapa nilai:

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

Gunakan sesuatu seperti ini jika Anda juga ingin menampilkan detail produk per tanggal sebagai 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"}}

Cobalah di SQL Fiddle

Peter Darmis
sumber
0

Ada kata kunci spesifik untuk mencapai hal yang sama.

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

Tergantung pada apa yang Anda butuhkan.

Dalam hal ini saya sarankan:

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

karena ada beberapa bidang dan waktu eksekusi DISTINCTlebih rendah daripada eksekusi GROUP BY.

Dalam kasus lain, misalnya di mana ada banyak bidang, saya lebih suka:

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