bir sütundan benzersiz değerler seçme


195

Aşağıdaki bilgi türünü içeren bir MySQL tablo var:

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

İşte bu tablodan veri almak için kullandığım bir komut dosyası örneği:

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

Bu komut dosyası tablodaki her tarihi görüntüler, ör.

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

Yalnızca benzersiz tarihler görüntülemek istiyorum, ör.

12.dec.2011
10.dec.2011

Olası MySQL
Jim Fell

Yanıtlar:


361

MySQL'de DISTINCT operatörünü kullanın :

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

18
Bunun talihsiz sorunu, DISTINCTyalnızca bir alanı döndürmesidir ... yani tüm kaydı istiyorsanız, DISTINCT değersizdir (bir id alanı olmadığı sürece ve id'in o listede olduğu ikinci bir sorgu yapabilirsiniz). İyi haber, ancak, bir JOIN sonucunda birden fazla yinelenen sonuç varsa, GROUP BY yapabilir ve tüm sonuçları filtreleyebilirsiniz.
Chadwick Meyer

1
Bu doğru değil Chadwick Meyer! Birden fazla alan seçebilirsiniz, ancak bunları gruplamanız gerekir. Bunu şu şekilde yapabilirsiniz: ADIM ADINIZI SEÇİN (ad), tablo ADINDAN KİMLİĞİNİZ OLARAK KİMDEN OLUN. Şaşıracaksınız!
Lucian Minea

43

kullanım

SELECT DISTINCT Date FROM buy ORDER BY Date

böylece MySQL yinelemeleri kaldırır

BTW: MySQL'den SELECTbüyük bir sonuç aldığınızda PHP'de açık sütun adları kullanmak daha az kaynak kullanır


1
"açık sütun adlarını kullanarak" açıklayabilir misiniz? hangi yol daha az kaynak alıyor ve hangisi yüksek? biraz örnek lütfen?
Nabeel Khan

Yaygın kullanım durumu, veritabanındaki verileri PHP'de çok boyutlu diziye "akıtmak" tır; PHP işleminiz, ihtiyaç duymayabileceğiniz verilerle hafızayı boşa harcar. Yalnızca bazı veri kümeleri için bu önemsizdir, ancak binlerce satırı işlerken bu bir fark yaratabilir.
Mart'ta

2
SELECT * kullanmak yerine @NabeelKhan ... SELECT sütun 1, sütun 2'yi kullanın ... Gerçekten tüm sütunlara ihtiyacınız yoksa.
LPChip

@LPChip tablename.columnname kullanarak sadece sütun adı üzerinde faydalıdır?
Nabeel Khan

1
@NabeelKhan tablolara katıldığınızda sadece tablename.columnname'e ihtiyacınız var.
LPChip

26

Değer almak için bu sorguyu kullanın

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

3
Bunun yardımcı olmadığını gördüm. Hepsi aynı dateama farklı 5 öğeniz olduğunu varsayalım description. Yukarıdaki komutu kullanarak edecek farklı göstermek dates, fakat sadece descriptionilk öğenin bulundu.
onebree

@ onebree - bu durumda yapabilirsiniz GROUP BY date,description.
ToolmakerSteve

19

Geri kalanlar neredeyse doğrudur, ancak DESC Tarihine göre sipariş vermeleri gerekir

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

6

DISTINCTbenzersiz değerler elde etmek için her zaman doğru seçimdir. Ayrıca alternatif olarak kullanmadan da yapabilirsiniz. İşte GROUP BY. Hangi basitçe sorgunun sonuna ekleyin ve ardından sütun adı.

SELECT * FROM buy GROUP BY date,description

4

DISTINCTBirden fazla değer içeren başka bir cevap:

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

2

Ayrıca, tarih başına ürün ayrıntılarını JSON olarak çıkarmak istiyorsanız, bunun gibi bir şey kullanın.

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

SQL Fiddle'da deneyin


0

Bunu başarmak için belirli bir anahtar kelime var.

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

0

İhtiyacınız olan şeye bağlıdır.

Bu durumda şunu öneririm:

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

çünkü çok az alan vardır ve yürütme süresi yürütme işleminden DISTINCTdaha düşüktür GROUP BY.

Diğer durumlarda, örneğin birçok alanın olduğu yerlerde, tercih ederim:

SELECT * FROM buy GROUP BY date ORDER BY date DESC;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.