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


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

Ответы:


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


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;

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; 

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;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.