почему этот запрос возвращает строку с нулями - PullRequest
8 голосов
/ 25 сентября 2011

сравнить

SELECT distinct u_id,timestamp as time
FROM my_table;

и

SELECT distinct u_id,max(timestamp) as time
FROM my_table;

Когда в моей таблице вообще нет строк (или если я добавлю предложение where, которое не соответствует строкам):

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

Может кто-нибудь объяснить мне, почему второйдействует как он?

Ответы [ 2 ]

17 голосов
/ 25 сентября 2011

В документации MySQL написано

MAX () возвращает NULL, если не было совпадающих строк.

А если у вас нет данных, то оба значения возвращаются как NULL.

Если вы хотите, чтобы второй запрос также возвращал пустой набор результатов, вы должны отфильтровать значения NULL, например, с помощью предложения HAVING, которое вы можете использовать с агрегатными функциями:

SELECT DISTINCT u_id, MAX(timestamp) as time FROM my_table GROUP BY u_id HAVING time IS NOT NULL;
0 голосов
/ 26 сентября 2011

Этот фактический ответ на этот вопрос довольно сложно объяснить, во всяком случае, для меня :). Заголовки: SQL не поддерживает агрегирующие операторы, как в реляционной модели, а просто поддерживает специальный случай суммирования.Кроме того, поскольку в SQL есть только одна структура данных - таблица - вызовы агрегатных операторов SQL (условно говоря) должны появляться как часть какого-либо табличного выражения, поэтому ваша вторая таблица возвращает «пустую» одиночную строку.* Более полное / лучшее объяснение см. Теория SQL и реляций: как точно определить код SQL - CJ Date (2009) , раздел 7.5.Агрегатные операторы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...