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


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.