2012-08-03 64 views
2

我正在尝试编写查询以查找eligble键。关键要求的标准是24小时内不得使用10次。基于计数和间隔的Mysql返回键

每次使用密钥时,记录都会保存在我的表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)
  • used_at(日期时间)

回答

2

会为你工作?

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 

**你可能不需要在selectCOUNT(ah.id) as num_usage_24hrs,我输出只是为了调试。

修订(应该ah.key_id = ak.id,不ah.key_id = ah.id

+0

这仍返回第一个关键,即使现在与used_at日期2012-08-03 00:00:00 – Kristian 2012-08-03 14:17:26

+0

固定api_history表10行。我从你的问题粘贴查询,并没有意识到加入条件不正确 – a1ex07 2012-08-03 14:21:52

+0

@Kris:检查更新的版本,它应该现在正常工作。 – a1ex07 2012-08-03 14:23:19

2

试一下:

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 
+0

你的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在第1行的GROUP BY ak.key中使用正确的语法(ah.id)<10 LIMIT 1' – Kristian 2012-08-03 14:16:24

+0

'ah.key_id = ah.id'不正确加入条件。它不会按预期工作。 – a1ex07 2012-08-03 14:53:07

+0

对不起。这是:ah.key_id = ak.id – tekilatexee 2012-08-06 07:27:38

1

我想你想的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)