Ключ возврата Mysql на основе количества и интервала

Я пытаюсь написать запрос, чтобы найти подходящий ключ. Критерием приемлемости ключа является то, что он не должен быть использован 10 раз в течение 24 часов.

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

Может ли кто-нибудь научить меня, как это сделать правильно? В настоящее время я получаю пустой ключ, так как в api_history нет записей. (Тогда он должен был просто вернуть первый дающий ключ).

Заранее спасибо!

Запрос:

SELECT ak.key 
FROM api_history ah 
  INNER JOIN api_keys ak ON ah.key_id = ah.id 
WHERE ah.used_at > DATE_SUB(now(), INTERVAL 1 DAY) 
HAVING COUNT(ah.id) < 10 LIMIT 0,1

Таблицы:

api_keys

  • идентификатор (целое число)
  • ключ (строка)

история API

  • идентификатор (целое число)
  • key_id (целое число)
  • used_at (дата-время)

person Kristian    schedule 03.08.2012    source источник


Ответы (3)


Будет ли это работать для вас?

SELECT ak.key, COUNT(ah.id) as num_usage_24hrs 
FROM api_keys  ak
LEFT JOIN api_history ah ON (ah.key_id = ak.id 
    AND ah.used_at > DATE_SUB(now(), INTERVAL 1 DAY) )    
GROUP BY ak.key
HAVING COUNT(ah.id) < 10 

** COUNT(ah.id) as num_usage_24hrs в select скорее всего не нужно, я вывожу просто для отладки.

ОБНОВЛЕНО (должно быть ah.key_id = ak.id, а не ah.key_id = ah.id )

person a1ex07    schedule 03.08.2012
comment
Это по-прежнему возвращает первый ключ, хотя в таблице api_history теперь 10 строк с датой used_at 2012-08-03 00:00:00. - person Kristian; 03.08.2012
comment
Фиксация. Я вставил запрос из вашего вопроса и не понял, что условие соединения неверно - person a1ex07; 03.08.2012

Попробуй это :

SELECT ak.key 
FROM api_keys ak
  LEFT JOIN api_history ah 
    ON  ah.key_id = ak.id 
    AND ah.used_at > DATE_SUB(now(), INTERVAL 1 DAY)
WHERE 1 
GROUP BY ak.key
HAVING COUNT(ah.id) < 10 
LIMIT 1
person Sébastien - Vélhost    schedule 03.08.2012
comment
У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, на предмет правильного синтаксиса для использования рядом с «GROUP BY ak.key HAVING COUNT (ah.id) ‹ 10 LIMIT 1» в строке 1. - person Kristian; 03.08.2012
comment
ah.key_id = ah.id - неверное условие соединения. Это не сработает, как ожидалось. - person a1ex07; 03.08.2012
comment
Извините.. Это: ah.key_id = ak.id - person Sébastien - Vélhost; 06.08.2012

Я думаю, вам нужен максимальный ключ в таблице api_keys, если я правильно понимаю. Так может быть, вы могли бы сделать что-то вроде этого?

SELECT max(ak.key) 
FROM api_keys ak
WHERE NOT EXISTS
(SELECT * FROM api_history ah 
WHERE ah.key_id = ak.id AND ah.used_at > DATE_SUB(now(), ITERVAL 1 DAY))
GROUP BY ah.key_id
HAVING COUNT(ah.id)<10)
person Connie    schedule 03.08.2012