2013-08-13 3 views
0

Я пытаюсь сделать так, чтобы я мог выбирать значения ниже 601 (чуть 10 минут). Я беру time() и вычитаю его полем time. Я не понимаю, почему он не работает. Может кто-нибудь объяснить или просто SQL не имеет этой способности. Я не получаю никаких ошибок, хотя он дает данные, которые не имеют большого смысла.Выполнять математику внутри оператора SQL?

$pdo->query("SELECT * FROM `online` WHERE '".time()."'-`time` > 601"); 

Он, похоже, не работает.

База данных

Database

Примеры данных

id = 1

uid = 1

time = 1 376252614 (Честно говоря, я не знаю, почему это TEXT. У меня не было проблемы с ним перед тем не менее, именно поэтому я предполагаю, что это не проблема)

+0

Оцените основы: '" SELECT '".time()."' - online.time AS t FROM online' - делает что? (Сначала укажите * what *.) – user2246674

+0

Используете ли вы MySQL? SQL Сервер – ermagana

+0

Да, я использую MySQL – Jake

ответ

1

Если вы работаете в MySQL, а ваш time - это тип данных или TIMESTAMP, попробуйте этот запрос.

WHERE `time` >= NOW() - INTERVAL 601 SECOND 

Если time столбец представляет собой целое число, содержащее метку времени Unix-стиль (или текстовую строку, показывающую целое число), то попробуйте это.

WHERE `time` >= UNIX_TIMESTAMP() - 601 

Этот способ структурирования запросов позволяет MySQL использовать индекс на вашей time колонке. Но, если временная метка является текстовой строкой, индекс будет работать немного странно.

Обратите внимание, что time является субоптимальным выбором для имени столбца, поскольку это зарезервированное слово MySQL. Вы должны быть прилежными, чтобы все время заключать его в backticks, или вы получите причудливые ошибки.

+0

Я изменю имя, если потребуется. Спасибо, это сработало! Второй - это то, что я пробовал, и он действительно работал. – Jake

+0

Пожалуйста, рассмотрите возможность использования целого числа или типа данных TIMESTAMP. Индексы текстовых строк иногда дают непредсказуемые результаты, если вы сравниваете целые числа. –

+0

... Преобразует ли текстовый столбец в целое число? Это означало бы, что он преобразует каждую строку (и игнорирует индекс); в противном случае я ожидал, что он будет сортировать '' 2'' _fter'''11'', что-то вроде этого. И здесь может не быть беспокойства (timestamps подразумевают значения журнала), но отрицательные значения также делают странные вещи для сортировки. –

0

По существу, что вы желая сделать следующее:

pdo->query("SELECT * FROM `online` WHERE ADDTIME(time, '0 0:10:0') > NOW()") 

Это один из способов от достижения вашей цели с MySQL, есть и другие функции, это только первый, который я видел, что соответствует моей потребности.

Этот метод добавит 10 минут к вашему времени, а затем сравните его с текущим временем, если оно больше текущего, то это означает, что это произошло за последние 10 минут.

+0

Tags (в настоящее время) состояние MySQL (правильно или нет). Обновите свой ответ для этой платформы.Однако вы направляетесь в правильном направлении (делая условие SARGable). –

+0

Вы правы, моя ошибка, я обновил ответ @ Clockwork-Muse – ermagana

+0

Ваше состояние больше не SARGable, и будет игнорировать любой индекс 'time' может иметь (предполагается, что' time' на самом деле является датой/временем тип, а не текст; по иронии судьбы, если 'ADDTIME()' преобразует строку в значение даты/времени, результаты должны быть правильными, что может быть не так для версии SARGable ...). –

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