2013-02-07 102 views
2

我有一个LIKES的MySQL表(像ID,用户ID,objectID,likeDate),我希望能够计算所有用户有问题后的'喜欢'。提高我的SQL的效率

通常我会得到的日期:

SELECT likeDate FROM LIKES WHERE userID = <logged in user's ID> 

,然后找到所有的日期和计数返回行(或用mysql COUNT)是这样的:

SELECT * FROM LIKES WHERE likeDate > <given date> 

不过,我敢肯定有一种方法可以在一个查询中执行此操作,而不是对数据库进行两次调用。谁能帮忙?

感谢

回答

2

订阅第一查询的结果直接进入第二个:

SELECT COUNT(*) 
FROM LIKES 
WHERE likeDate > (
    SELECT max(likeDate) 
    FROM LIKES 
    WHERE userID = <logged in user's ID> 
) 

但是请注意,您需要在第一个查询中添加使用max()

此查询应该是以最快的方式得到您的答案。为了确保最佳的性能,加上指标上都userIDlikeDate

create index likes_userId on likes(userID); 
create index likes_likeDate on likes(likeDate); 
+0

谢谢@Bohemian,但不是lc的答案稍微有效一些? – tommyd456

+1

绝对不是!他的问题很糟糕 - 他是O(n),我的是O(1)。即他的子查询对表中的每一行执行一次!我无法想象一个更糟的查询实际上,如果它甚至工作。 – Bohemian

+0

哈哈 - 好的谢谢 - 我现在可以看到你的观点 – tommyd456

1
SELECT l1.likeDate, 
    (SELECT COUNT(1) FROM LIKES l2 WHERE l2.likeDate > l1.likeDate) AS likesAfter 
FROM LIKES l1 
WHERE userID = ? 
GROUP BY l1.likeDate 

或者作为一个连接,

SELECT l1.likeDate, COUNT(1) 
FROM LIKES l1 
LEFT OUTER JOIN LIKES l2 ON l2.likeDate > l1.likeDate 
WHERE userID = ? 
GROUP BY l1.likeDate 
+0

右这里有几个很好的答案 - 任何想法上这是最有效的??? – tommyd456

0
SELECT * FROM LIKES WHERE likeDate > 
IFNULL((SELECT max(likeDate) FROM LIKES WHERE userID = <logged in user's ID> 
            adn objectId=<question's Id>),0) 
and objectId=<question's Id>