2012-04-24 2 views
6

Table1 имеет 3 колонки: col1, col2, col3Как выбрать два столбца, где один столбец должен быть DISTINCT?

Как я SELECT все DISTINCT значения col1 где col3 равно определенное значение, затем отсортировать его по col2 DESC, но имеют различные col1 результаты показывают соответствующие им col2 значение ?

Я попытался следующие, но это не сработало:

SELECT DISTINCT (col1), col2 
FROM `Table1` 
WHERE `col3` = 'X' 
ORDER BY `col2` DESC 

выше не приводит к различным значениям col1. Если я удалю «, col2», тогда он отобразит различные значения col1, но он не покажет мне их соответствующие значения col2.

Итак, как мне это сделать?

+0

'select distinct' относится ко всей строке, а не к отдельным полям. –

+3

, какую ценность вы хотите от Col2? как будет много разных значений для каждого col1? – ManseUK

+0

@Marc B, спасибо, но как мне показать все столбцы всей строки? – ProgrammerGirl

ответ

9

Возможно, что-то вроде этого:

SELECT col1, MAX(col2) col2_max 
FROM Table1 
WHERE col3 = 'X' 
GROUP BY col1 
ORDER BY col2_max 

?

Вы можете поиграть с этим в этом SQL Fiddle.

+0

Все, что отсутствует, этот ответ добавляет 'DESC' после' ORDER BY col2_max', но это сработало! Я знал, что должно быть простое и простое решение. Я даю вам ответ, потому что вы также познакомили меня с SQL Fiddle. Благодаря! – ProgrammerGirl

1

Я предполагаю, хотите наибольшее col2 для каждого col1:

SELECT tm.* 
FROM (
     SELECT DISTINCT col1 
     FROM table1 
     WHERE col3 = 'X' 
     ) t 
JOIN table tm 
ON  id = 
     (
     SELECT id 
     FROM table1 ti 
     WHERE ti.col3 = 'X' 
       AND ti.col1 = t.col1 
     ORDER BY 
       col2 DESC 
     LIMIT 1 
     ) col2 
ORDER BY 
     col2 DESC 

Создать индекс на (col3, col1, col2) для этого, чтобы работать быстро.

Update:

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

SELECT col1, MAX(col2) AS maxcol2 
FROM table1 
WHERE col3 = 'X' 
GROUP BY 
     col1 
ORDER BY 
     maxcol2 DESC 

Но если вам нужно всю запись (вместе с дополнительными полями possbily содержащиеся в таблице), вам понадобится исходный синтаксис.

+1

Ничего себе, пожалуйста, извините мое невежество, но что-то такое простое требует такого сложного вопроса?Невозможно ли просто сообщить MySQL о возврате DISTINCT (col1), упорядоченного по col2 DESC, а затем просто показать соответствующие значения col3 для каждой строки? – ProgrammerGirl

+0

@programmer: если у вас есть две записи с одним и тем же 'col1', но с другим' col2', в какую запись должен возвращаться запрос? – Quassnoi

+0

@Programmer: nevermind, увидел ваш комментарий к оригинальному сообщению. Да, это требует такого сложного запроса. В 'PostgreSQL' вы можете использовать' DISTINCT ON' (который делает именно то, что вы хотите), в «Oracle 8i +» и «SQL Server 2005 +» (и «PostgreSQL 8.4 +») вы можете использовать 'ROW_NUMBER()'. В 'MySQL' вам это нужно. – Quassnoi

-1
SELECT t.col1, max(t.col2) 
    FROM Table1 t 
WHERE t.col3='X' 
GROUP BY t.col1 
ORDER BY t.col2 DESC; 

EDIT: Этот ответ имел несколько изменений, сохраняя наиболее точным.

+0

Это просто вернет все записи с помощью 'col3 = 'X'' – Quassnoi

+0

-1 - Это не приведет к возврату нечетких строк, так как несколько похожих значений во внешнем запросе будут соответствовать одному значению, возвращаемому в подзапросе. SQL основан на наборе и не собирается «удалять» строку после ее использования. –

+0

@ X-Zero: на самом деле, этот будет возвращать то, что запросил оператор (за исключением того, что он излишне сложный и вложенный запрос является избыточным). – Quassnoi

3

Я уверен, что MYSQL поддерживает положение GROUP BY, и с учетом вы хотите наибольшее значение col2, это вы должны получить результаты, которые вы хотите:

SELECT col1, MAX(col2) as col2 
FROM Table1 
WHERE col3 = 'X' 
GROUP BY col1 
ORDER BY col2 
Смежные вопросы