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.