выбор уникальных значений из столбца

195

У меня есть таблица 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
meandme
источник

Ответы:

361

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

SELECT DISTINCT(Date) AS Date FROM buy ORDER BY Date DESC;
Леон Роденбург
источник
18
К сожалению, проблема DISTINCTзаключается в том, что он возвращает только это одно поле ... поэтому, если вам нужна вся запись, DISTINCT бесполезен (если только это не поле id, и вы можете выполнить второй запрос, где id IN в этом списке). Хорошие новости, однако, если у вас есть несколько повторяющихся результатов в результате JOIN, вы можете выполнить GROUP BY и отфильтровать полные результаты.
Чедвик Мейер
1
Это не правильно, Чедвик Мейер! Вы можете выбрать несколько полей, но вы должны сгруппировать их. Вы можете сделать это следующим образом: SELECT DISTINCT (name) AS yourName, id AS yourId ИЗ таблицы GROUP BY name ORDER BY name. Вы будете удивлены!
Люсьен
43

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

SELECT DISTINCT Date FROM buy ORDER BY Date

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

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

rabudde
источник
1
Можете ли вы объяснить "использование явных имен столбцов"? какой путь требует меньше ресурсов, а какой высокий? с примером немного пожалуйста?
Набиль Хан
Обычный вариант использования - «поток» данных из базы данных в многомерный массив в PHP; поэтому ваш процесс PHP просто тратит впустую память с данными, которые вам могут не понадобиться. Только для некоторых наборов данных это незначительно, но при обработке тысяч строк это может иметь значение.
Рабудде
2
@NabeelKhan вместо использования SELECT * ... используйте SELECT столбец 1, столбец 2 ... Если вам действительно не нужны все столбцы.
LPChip
@LPChip с использованием tablename.columnname выгодно только для имени столбца?
Набиль Хан
1
@NabeelKhan вам нужно только имя таблицы.колонка, когда вы присоединяетесь к таблицам.
LPChip
26

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

SELECT * FROM `buy` group by date order by date DESC
Джон
источник
3
Я обнаружил, что это не помогло. Скажем, у вас есть 5 предметов, все с одинаковыми, dateно разными description. Используя приведенные выше команды будут отчетливые dateс, но только descriptionпервого найденного элемента.
15.15
@onebree - в этом случае вы можете сделать GROUP BY date,description.
ToolmakerSteve
19

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

SELECT DISTINCT(Date) AS Date FROM buy ORDER BY Date DESC;
ajreal
источник
6

DISTINCTвсегда правильный выбор, чтобы получить уникальные значения. Также вы можете сделать это альтернативно, не используя его. Это GROUP BY. Который просто добавляет в конце запроса и сопровождается именем столбца.

SELECT * FROM buy GROUP BY date,description
Kvvaradha
источник
4

Другой DISTINCTответ, но с несколькими значениями:

SELECT DISTINCT `field1`, `field2`, `field3` FROM `some_table`  WHERE `some_field` > 5000 ORDER BY `some_field`
CONvid19
источник
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; 
Ашутош Двиведи
источник
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;
Марко Деспозито
источник