Ключ за връщане на 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

  • id (int)
  • ключ (низ)

api_history

  • id (int)
  • key_id (int)
  • използвано_при (дата и час)

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
Това все още връща първия ключ, въпреки че вече има 10 реда в таблицата api_history с датата 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