Знак неравенства в регистре SQL, похоже, работает в обратном направлении? - PullRequest
1 голос
/ 06 декабря 2011

n00b спрашивающий здесь.Я пытаюсь сделать запрос, который проверяет, была ли самая последняя активность за последние 24 часа.Технически я могу получить желаемый результат, но неравенство в моем заявлении должно быть в противоположном направлении, что будет иметь смысл для меня.Вот мой запрос:

SELECT sqs.registration_id,
       MAX(sqs.completed_at)           AS 'most recent activity',
       DATE_SUB(NOW(), INTERVAL 1 DAY) AS 'one day ago',
       'recent activity?' = CASE
                              WHEN MAX(sqs.completed_at) < 
                                         DATE_SUB(NOW(), INTERVAL 1 DAY) 
                              THEN 1
                              ELSE 0
                            END
FROM   student_quiz_states sqs
WHERE  sqs.score = 100
GROUP  BY sqs.registration_id  

Вот пример результата:

XXXXX   2011-08-02 16:23:53 2011-12-05 00:06:05 0

У этого пользователя не было активности за последние 24 часа, поэтому последнее значение возвращает 0, как я хочук.

Однако это не имеет никакого смысла для меня.Разве инструкция case не должна возвращать 1, так как первая дата-время намного раньше, чем один день назад?Для меня будет иметь смысл, если мои желаемые результаты будут возвращены, когда в моем когда_клаузе содержится> вместо <.</p>

Любые объяснения приветствуются.

1 Ответ

4 голосов
/ 06 декабря 2011

Проблема в том, что ваш запрос содержит 'recent activity?' = CASE ... END, где он должен иметь CASE ... END AS 'recent activity?'.Первый - это тест на равенство, а не выражение с псевдонимом.Причина, по-видимому, «перевернутого» поведения заключается в том, что, поскольку выражение CASE является числовым (оно оценивается как 0 или 1), MySQL выполняет числовой тест на равенство путем преобразования 'recent activity?' в 0.0 ( подробные правила здесь ), такие что 'recent activity?' = CASE ... END равно true , когда выражение CASE дает 0 и false , когда оно дает 1.Поскольку MySQL представляет true как 1 и false как 0, конечный результат противоположен ожидаемому.

(Примечание: ранееверсия этого ответа, хотя и содержала те же базовые замечания о тестах на равенство и псевдонимах, а также о том, что false и true , являющиеся 0 и 1, была неопределенной / запутанной вс другой стороны, поскольку я не осознавал, что СУБД была MySQL, и не знал, что некоторые СУБД допускают использование одинарных кавычек при цитировании псевдонимов, поэтому некоторые комментарии выше и ниже кажутся немного странными, потому что ониВы ссылаетесь на эту версию. Текущее состояние ответа во многом благодаря этим комментариям.)

...