从列中选择唯一值


196

我有一个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

Answers:


362

在MySQL中使用DISTINCT运算符:

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

18
不幸的问题DISTINCT是,它仅返回一个字段...因此,如果您想要整个记录,则DISTINCT是毫无价值的(除非它是一个id字段,您可以在该列表中的id处进行第二次查询)。不过,好消息是,如果由于JOIN而导致多个重复结果,则可以执行GROUP BY并过滤所有结果。
Chadwick Meyer 2015年

1
那是不正确的查德威克·迈耶!您可以选择多个字段,但是必须将它们分组。您可以这样:SELECT DISTINCT(name)AS yourName,id AS yourId FROM table GROUP BY name ORDER BY name。您会感到惊讶!
Lucian Minea

44

SELECT DISTINCT Date FROM buy ORDER BY Date

所以MySQL删除重复项

顺便说一句:SELECT当您从MySQL获得大量结果时,使用显式列名在PHP 中使用较少的资源


1
你能解释“使用显式列名”吗?哪种方式占用的资源较少,哪个较高?请举个例子吗?
Nabeel Khan

常见的用例是用PHP将数据从数据库“流化”到多维数组中。因此您的PHP流程只会浪费您可能不需要的数据。对于仅某些数据集而言,这可以忽略不计,但是当处理数千行时,这可能会有所作为。
拉布德

2
@NabeelKhan而不是使用SELECT * ...使用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
我发现这没有帮助。假设您有5个项目,date但全部相同但又不同description。使用以上命令显示不同date的,但仅显示description找到的第一项。
onebree

@onebree-在这种情况下,您可以执行GROUP BY date,description
制造商史蒂夫(Steve),

20

其余的几乎是正确的,除了它们应该按日期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;

因为字段很少并且的执行时间DISTINCT比的执行时间短GROUP BY

在其他情况下,例如在许多字段中,我更喜欢:

SELECT * FROM buy GROUP BY date ORDER BY date DESC;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.