从列中选择唯一值

我有一个包含以下类型信息的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
410804 次浏览

使用

SELECT DISTINCT Date FROM buy ORDER BY Date

所以MySQL删除重复项

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

在MySQL中使用不同的运算符:

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

其余的几乎是正确的,除了他们应该按日期描述排序。

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

使用此查询获取值

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

__,ABC__0始终是获取唯一值的正确选择。你也可以在不使用它的情况下做它。这是GROUP BY。它只是在查询的末尾添加,后面是列名。

SELECT * FROM buy GROUP BY date,description

另一个DISTINCT答案,但具有多个值:

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

如果您还希望将每个日期的产品详细信息输出为JSON,并且MySQL版本不支持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摆弄中试用

如果您使用的是支持JSON功能的MySQL版本,则可以重写上述查询:

SELECT `date`,JSON_OBJECTAGG(CONCAT('product-',`product_id`),JSON_OBJECT('id', `product_id`, 'name', `product_name`)) as `productsJSON`
FROM `buy` group by `date`
order by `date` DESC;

DB小提琴中尝试这两种方法

这取决于你需要什么。

在这种情况下,我建议:

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

因为存在很少的字段,并且DISTINCT的执行时间低于GROUP BY的执行时间。

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

SELECT * FROM buy GROUP BY date ORDER BY date DESC;

有一个特定的关键字来实现这一点。

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