selecionando valores exclusivos de uma coluna


196

Eu tenho uma tabela MySQL que contém o seguinte tipo de informação:

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

Aqui está um exemplo de um script que eu uso para obter dados desta tabela:

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

Este script exibe todas as datas da tabela, por exemplo

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

Gostaria de exibir apenas datas únicas, por exemplo

12.dec.2011
10.dec.2011

Respostas:


362

Use o operador DISTINCT no MySQL:

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

18
O infeliz problema de DISTINCTé que ele retorna apenas um campo ... então, se você deseja o registro inteiro, o DISTINCT não vale nada (a menos que seja um campo de identificação e você pode fazer uma segunda consulta onde identifique nessa lista). Boas notícias, no entanto, se você tiver vários resultados duplicados como resultado de um JOIN, poderá fazer um GROUP BY e obter os resultados completos filtrados.
— Chadwick Meyer

1
Isso não está correto, Chadwick Meyer! Você pode escolher vários campos, mas precisa agrupá-los. Você pode fazer assim: SELECT DISTINCT (nome) COMO yourName, id como yourId FROM tabela GROUP BY name ORDER BY name. Você ficará surpreso!
— Lucian Minea

44

usar

SELECT DISTINCT Date FROM buy ORDER BY Date

então o MySQL remove duplicatas

BTW: o uso de nomes explícitos de coluna SELECTusa menos recursos no PHP quando você obtém um grande resultado do MySQL


1
você pode explicar "usando nomes de colunas explícitos"? qual o caminho que leva menos recursos e qual é o mais alto? com exemplo um pouco por favor?
— Nabeel Khan

Caso de uso comum é "transmitir" dados do banco de dados para uma matriz multidimensional em PHP; portanto, seu processo PHP simplesmente desperdiça memória com dados que talvez você não precise. Para apenas alguns conjuntos de dados, isso é insignificante, mas ao lidar com milhares de linhas, isso pode fazer a diferença.
— rabudde 30/03

2
@NabeelKhan em vez de usar SELECT * ... use SELECT coluna 1, coluna 2 ... A menos que você realmente precise de todas as colunas.
— LPChip

@LPChip usando tablename.columnname é benéfico apenas sobre columnname?
— Nabeel Khan

1
@NabeelKhan, você só precisa de tablename.columnname quando ingressar em tabelas.
— LPChip

26

Use esta consulta para obter valores

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

3
Eu achei que isso não foi útil. Digamos que você tenha 5 itens, todos iguais, datemas diferentes description. Usando o comando acima irá mostrar distintas dates, mas apenas o descriptiondo primeiro item encontrado.
— Onebree

@ onebree - nesse caso, você pode fazer GROUP BY date,description.
— Página Inicial>

20

O restante está quase correto, exceto que eles devem ordenar por Data DESC

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

6

DISTINCTé sempre uma escolha certa para obter valores únicos. Além disso, você pode fazer isso alternativamente sem usá-lo. É isso GROUP BY. Que simplesmente foi adicionado no final da consulta e seguido pelo nome da coluna.

SELECT * FROM buy GROUP BY date,description

4

Outra DISTINCTresposta, mas com vários valores:

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

2

Use algo assim, caso você também queira gerar detalhes dos produtos por data como 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"}}

Experimente no SQL Fiddle


0

Existe uma palavra-chave específica para alcançar o mesmo.

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

0

Depende do que você precisa.

Nesse caso, sugiro:

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

porque existem poucos campos e o tempo de execução de DISTINCTé menor que a execução de GROUP BY.

Em outros casos, por exemplo, onde existem muitos campos, prefiro:

SELECT * FROM buy GROUP BY date ORDER BY date DESC;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.