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.