вибір унікальних значень із стовпця


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 у цьому списку). Хоча хороша новина, якщо у вас є декілька повторюваних результатів в результаті ПРИЄДНАННЯ, ви можете зробити групу BY і отримати повний результат відфільтрований.
Чадвік Мейєр

1
Це не правильно Чадвік Мейєр! Ви можете вибрати кілька полів, але їх потрібно згрупувати. Ви можете зробити так: ВИБІРУЙТЕ ДІСТИНЦТ (ім'я) ЯК Ім'я, ідентифікатор ЯК ІДИ З таблиці ГРУПА ІМЯ ЗАМОВИТИ ІМЯ Ви здивуєтесь!
Мінея

43

використання

SELECT DISTINCT Date FROM buy ORDER BY Date

тому MySQL видаляє дублікати

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


1
чи можете ви пояснити "використання явних імен стовпців"? який спосіб забирає менше ресурсів і який високий? з прикладом трохи будь ласка?
Набіель Хан

Загальний випадок використання - це "передача" даних із бази даних в багатовимірний масив в PHP; тому ваш PHP-процес просто витрачає пам'ять на дані, які вам можуть не знадобитися. Для деяких наборів даних це незначно, але при обробці тисяч рядків це може змінити значення.
rabudde

2
@NabeelKhan замість SELECT * ... використовуйте SELECT стовпець 1, стовпець 2 ... Якщо вам справді не потрібні всі стовпці.
LPChip

@LPChip з використанням tablename.columnname вигідніше лише для імені стовпця?
Набіель Хан

1
@NabeelKhan вам потрібно лише tablename.columnname, коли ви приєднуєтесь до таблиць.
LPChip

26

Використовуйте цей запит, щоб отримати значення

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

3
Я виявив, що це не корисно. Скажімо, у вас є 5 предметів, усі з однаковими, dateале різними description. Використовуючи наведені вище команди будуть чіткі dateс, але тільки descriptionпершого знайденого елемента.
onebree

@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.