열에서 고유 한 값 선택


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.