2012-04-26 3 views
1

У меня есть база данных с 1 таблицей со следующими строками:MySQL выбрать отчетливый не работает

id  name  date 
----------------------- 
1  Mike  2012-04-21 
2  Mike  2012-04-25 
3  Jack  2012-03-21 
4  Jack  2012-02-12 

Я хочу, чтобы извлечь только определенные значения, так что я буду только получить Майк и Джек один раз. У меня есть этот код для поиска сценария:

SELECT DISTINCT name FROM table WHERE name LIKE '%$string%' ORDER BY id DESC 

Но это не работает. Он выводит Майка, Майка, Джека, Джека.

Почему?

+3

В чем ваш вопрос? – eggyal

+0

он не выбирает различные, он выводит все имена даже дубликатов – bizkit1

+0

Если ваш вывод - это только имя, то почему вы используете ORDER по id. Кроме того, SQL, который вы используете, выглядит правильно для того, что вы просите. Попробуйте следующее: ** SELECT DISTINCT name FROM table WHERE name LIKE '% $ string%' ORDER BY name DESC ** – Linger

ответ

4

В силу пункта ORDER BY id DESC, запрос обрабатывается, скорее, как если бы оно было написано:

SELECT DISTINCT name, id 
    FROM table 
ORDER BY id DESC; 

за исключением того, что id столбцы не возвращаются пользователю (вы). Набор результатов должен содержать id, чтобы иметь возможность заказать его. Очевидно, что этот набор результатов имеет четыре строки, так что это то, что возвращается. (Мораль:. Не заказываем скрытыми колоннами —, если вы не знаете, что он собирается сделать, чтобы ваш запрос)

Try:

SELECT DISTINCT name 
    FROM table 
ORDER BY name; 

(с или без DESC по прихоти). Это вернет только две строки.

Если вам нужно знать об id для каждого имени, рассмотреть следующие вопросы:

SELECT name, MIN(id) 
    FROM table 
GROUP BY name 
ORDER BY MIN(id) DESC; 

Вы можете использовать MAX одинаково хороший эффект.

Все это относится ко всем базам данных SQL, включая MySQL. У MySQL есть некоторые правила, которые позволяют вам опускать предложения GROUP BY с несколькими недетерминированными результатами. Я рекомендую не использовать эту функцию.

Долгое время (возможно, даже сейчас) стандарт SQL не позволял вам заказывать по столбцам, которые не были в списке выбора, чтобы избежать подобных недоразумений. Когда результирующий набор не включает данные упорядочения, упорядочение набора результатов называется «существенным упорядочением»; если в результирующем наборе отображаются все упорядочивающие столбцы, это «несущественный порядок», потому что у вас достаточно данных для заказа данных самостоятельно.

Смежные вопросы