MySQL 5.5 SELECT DISTINCT - Как вернуть более одного столбца без дублирования запроса? - PullRequest
1 голос
/ 30 декабря 2011

Похоже на MySQL 5.5 SELECT DISTINCT отлично работает только с одним столбцом.

SELECT DISTINCT type FROM table
WHERE type LIKE 'h%'
LIMIT 5;

возвращает хороший результат:

type
--------
htm
html
htaccess

Но при попытке SELECT два или более столбцов

SELECT DISTINCT id, type FROM table
WHERE type LIKE 'h%'
LIMIT 5;

возвращает ошибочный результат с дублированными запросами:

id | type
---+--------
1  | htm
3  | htm
5  | html
6  | html
7  | html

Ожидаемый результат:

id | type
---+--------
3  | htm
7  | html
5  | htaccess

Столбец id не нуждается в применении DISTINCT, поскольку он имеет AUTO_INCREMENT.

Ответы [ 5 ]

5 голосов
/ 30 декабря 2011

Вы хотите group by:

select
   max(id) as id,
   type
from
   table
where type like 'h%'
group by type

distinct получает вас distinct строк - это означает, что если каждое значение в каждое столбец такой же, как строка уже в наборе результатов, он покажет эту строку.В этом случае он ведет себя точно так, как описано.

Выполняя group by и используя агрегатные функции (например, max), вы указываете столбцы, которые вы хотите различать, а вы агрегируетедругие столбцы, чтобы предоставить вам набор результатов, который вы ищете.

2 голосов
/ 30 декабря 2011
SELECT 
  min(id) as id,
  type
FROM table
WHERE type LIKE 'h%'
GROUP BY type
LIMIT 5;
1 голос
/ 30 декабря 2011

Они не являются дублированными строками.Отличительный означает, что каждая комбинация значений столбцов отличается для всех остальных.Как видите, 1 | htm и 3 | htm - это не одно и то же, тогда они разные.

0 голосов
/ 30 августа 2012

MySQL 5.5

SELECT DISTINCT - Как вернуть один столбец без дублирования запроса?

Если у вас есть таблица сотрудников, например:

Eno Ename Location

Когда у вас естьболее одного местоположения для сотрудника, и вы хотите увидеть уникальные местоположения:

SELECT DISTINCT 
    Eno,Ename,(Location) 
FROM 
    Employee
0 голосов
/ 30 декабря 2011

Во-первых, для пояснения:

SELECT DISTINCT id, type FROM table
WHERE type LIKE 'h%'
LIMIT 5;

Этот запрос работает, как и ожидалось, потому что id - это auto_increment, там нет дубликатов, поэтому отчетливо бессмысленно.

Во-вторых, что выпытаясь достичь?Независимо от того, выполняете ли вы DISTINCT или GROUP BY для столбца типа, вы получите идентификатор, который представляет только одну строку в таблице, даже если несколько строк в таблице имеют одно и то же значение (каждое с различным идентификатором).

...