MySQL: выберите только уникальные значения из столбца

У меня есть таблица 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, MY", 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 

Solutions Collecting From Web of "MySQL: выберите только уникальные значения из столбца"

Используйте оператор DISTINCT в MySQL:

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

использование

 SELECT DISTINCT Date FROM buy ORDER BY Date 

поэтому MySQL удаляет дубликаты

BTW: использование явных имен столбцов в SELECT использует меньше ressources в PHP, когда вы получаете большой результат от MySQL

Используйте этот запрос для получения значений

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

Остальные почти правильны, за исключением того, что они должны заказывать по дате DESC

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

DISTINCT всегда является правильным выбором для получения уникальных значений. Также вы можете сделать это, не используя его. Это 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.

 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

Существует определенное ключевое слово для достижения того же.

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

Зависит от того, что вам нужно.

В этом случае я предлагаю:

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

потому что есть несколько полей, а время выполнения DISTINCT ниже, чем выполнение GROUP BY .

В других случаях, например, когда есть много полей, я предпочитаю:

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