chọn các giá trị duy nhất từ ​​một cột


196

Tôi có một bảng MySQL chứa loại thông tin sau:

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

Dưới đây là một ví dụ về tập lệnh tôi sử dụng để lấy dữ liệu từ bảng này:

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

Kịch bản này hiển thị mỗi ngày từ bảng, ví dụ

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

Tôi chỉ muốn hiển thị ngày duy nhất, ví dụ:

12.dec.2011
10.dec.2011

Câu trả lời:


362

Sử dụng toán tử DISTINCT trong MySQL:

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

18
Vấn đề đáng tiếc DISTINCTlà nó chỉ trả về một trường đó ... vì vậy nếu bạn muốn toàn bộ bản ghi, DISTINCT là vô giá trị (trừ khi đó là trường id và bạn có thể thực hiện truy vấn thứ hai trong đó id trong danh sách đó). Tuy nhiên, tin tốt là nếu bạn có nhiều kết quả trùng lặp do THAM GIA, bạn có thể thực hiện NHÓM THEO và nhận được kết quả đầy đủ được lọc.
Chadwick Meyer

1
Điều đó không đúng Chadwick Meyer! Bạn có thể chọn nhiều lĩnh vực, nhưng bạn phải nhóm chúng. Bạn có thể làm cho nó như thế này: CHỌN DISTINCT (tên) AS yourName, id AS yourId TỪ bảng NHÓM THEO Tên ĐẶT HÀNG theo tên. Bạn sẽ bất ngờ !
Lucian Minea

44

sử dụng

SELECT DISTINCT Date FROM buy ORDER BY Date

vì vậy MySQL loại bỏ trùng lặp

BTW: sử dụng tên cột rõ ràng trong việc SELECTsử dụng ít tài nguyên hơn trong PHP khi bạn nhận được kết quả lớn từ MySQL


1
bạn có thể giải thích "sử dụng tên cột rõ ràng" không? cách nào ít sử dụng tài nguyên và cách nào cao? với ví dụ một chút xin vui lòng?
Nabeel Khan

Trường hợp sử dụng phổ biến là "truyền" dữ liệu từ cơ sở dữ liệu vào mảng đa chiều trong PHP; vì vậy quá trình PHP của bạn chỉ đơn giản là lãng phí bộ nhớ với dữ liệu bạn có thể không cần. Đối với chỉ một số bộ dữ liệu, điều này là không đáng kể, nhưng khi xử lý hàng ngàn hàng, điều này có thể tạo ra sự khác biệt.
rabudde 30/03/2016

2
@NabeelKhan thay vì sử dụng CHỌN * ... sử dụng cột CHỌN 1, cột 2 ... Trừ khi bạn thực sự cần tất cả các cột.
LPChip

@LPChip sử dụng tablename.columnname chỉ có lợi cho tên cột?
Nabeel Khan

1
@NabeelKhan bạn chỉ cần tablename.columnname khi bạn tham gia các bảng.
LPChip

26

Sử dụng truy vấn này để nhận giá trị

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

3
Tôi thấy rằng điều này là không hữu ích. Giả sử bạn có 5 mục, tất cả đều giống nhau datenhưng khác nhau description. Sử dụng lệnh trên sẽ hiển thị dates khác biệt , nhưng chỉ descriptionmục đầu tiên được tìm thấy.
onebree

@onebree - trong trường hợp đó, bạn có thể làm GROUP BY date,description.
ToolmakerSteve

20

Phần còn lại gần như chính xác, ngoại trừ họ nên đặt hàng theo Ngày DESC

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

6

DISTINCTluôn luôn là một lựa chọn đúng đắn để có được những giá trị độc đáo Ngoài ra, bạn có thể làm nó thay thế mà không cần sử dụng nó. Đó là GROUP BY. Mà chỉ cần thêm vào cuối truy vấn và theo sau là tên cột.

SELECT * FROM buy GROUP BY date,description

4

Một DISTINCTcâu trả lời khác , nhưng với nhiều giá trị:

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

2

Sử dụng một cái gì đó như thế này trong trường hợp bạn cũng muốn xuất chi tiết sản phẩm mỗi ngày dưới dạng 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"}}

Dùng thử trong SQL Fiddle


0

Có một từ khóa cụ thể để đạt được cùng.

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

0

Phụ thuộc vào những gì bạn cần.

Trong trường hợp này tôi đề nghị:

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

bởi vì có ít trường và thời gian thực hiện DISTINCTthấp hơn thời gian thực hiện GROUP BY.

Trong các trường hợp khác, ví dụ, nơi có nhiều trường, tôi thích:

SELECT * FROM buy GROUP BY date ORDER BY date DESC;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.