열에서 고유 한 값 선택


195

다음 유형의 정보가 포함 된 MySQL 테이블이 있습니다.

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

다음은이 테이블에서 데이터를 가져 오는 데 사용하는 스크립트의 예입니다.

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

이 스크립트는 테이블의 모든 날짜를 표시합니다 (예 :

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

고유 한 날짜 만 표시하고 싶습니다 (예 :

12.dec.2011
10.dec.2011

답변:


361

MySQL 에서 DISTINCT 연산자를 사용하십시오 .

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

18
불행히도 문제는 DISTINCT하나의 필드 만 반환한다는 것입니다. 따라서 전체 레코드를 원한다면 DISTINCT는 가치가 없습니다 (ID 필드가 아닌 경우 id가 해당 목록에있는 두 번째 쿼리를 수행 할 수는 없습니다). 하지만 좋은 소식은 JOIN의 결과로 중복 된 결과가 여러 개인 경우 GROUP BY를 수행하고 전체 결과를 필터링 할 수 있다는 것입니다.
채드윅 메이어

1
Chadwick Meyer가 맞지 않습니다! 여러 필드를 선택할 수 있지만 그룹화해야합니다. 다음과 같이 만들 수 있습니다. SELECT DISTINCT (name) AS yourName, id AS yourId FROM 테이블 GROUP BY name ORDER BY name. 당신은 놀랄 것입니다!
Lucian Minea

43

사용하다

SELECT DISTINCT Date FROM buy ORDER BY Date

그래서 MySQL은 중복을 제거합니다

BTW : SELECTMySQL에서 큰 결과를 얻을 때 명시 적 열 이름을 사용하면 PHP에서 적은 리소스 를 사용합니다.


1
"명시적인 열 이름 사용"을 설명 할 수 있습니까? 어느 쪽이 자원을 덜 사용하고 어느 쪽이 높습니까? 예를 들어 조금 부탁드립니다.
Nabeel Khan

일반적인 사용 사례는 PHP에서 데이터베이스의 데이터를 다차원 배열로 "스트리밍"하는 것입니다. 따라서 PHP 프로세스는 필요하지 않은 데이터로 메모리를 낭비합니다. 일부 데이터 세트의 경우 이는 무시할 만하지 만 수천 행을 처리 할 때 차이가 생길 수 있습니다.
rabudde

2
SELECT * ... 대신 @NabeelKhan을 사용하십시오. SELECT 열 1, 열 2를 사용하십시오. 실제로 모든 열이 필요하지 않은 한.
LPChip

tablename.columnname을 사용하는 @LPChip은 columnname보다 유리합니까?
Nabeel Khan

1
@ NabeelKhan 테이블을 조인 할 때 tablename.columnname 만 필요합니다.
LPChip

26

이 쿼리를 사용하여 값을 얻으십시오.

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

3
도움이되지 않았다는 것을 알았습니다. 모두 date같지만 다른 5 개의 항목이 있다고 가정합니다 description. 위의 명령 사용하면 구별 표시 date되지만 description첫 번째 항목 만 표시 됩니다.
onebree

@onebree-그렇다면 할 수 있습니다 GROUP BY date,description.
ToolmakerSteve

19

나머지는 Date DESC로 주문해야한다는 점을 제외하고는 거의 정확합니다.

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

6

DISTINCT항상 고유 한 값을 얻는 올바른 선택입니다. 또한 사용하지 않고 대안으로 할 수 있습니다. 그렇습니다 GROUP BY. 쿼리 끝에 추가하고 열 이름을 추가 한 것입니다.

SELECT * FROM buy GROUP BY date,description

4

또 다른 DISTINCT대답이지만 여러 값이 있습니다.

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

2

날짜별로 제품 세부 정보를 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"}}

SQL Fiddle 에서 사용해보십시오


0

이를 달성하기위한 구체적인 키워드가 있습니다.

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

0

필요한 것에 따라 다릅니다.

이 경우에 나는 제안한다 :

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

필드가 적고의 실행 시간 DISTINCT이의 실행보다 낮기 때문입니다 GROUP BY.

다른 경우, 예를 들어 많은 필드가있는 경우 선호합니다.

SELECT * FROM buy GROUP BY date ORDER BY date DESC;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.