2013-02-07 99 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>