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


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.