2013-04-27 63 views
0

我有很多表記錄用戶在某個論壇上的操作,每個日誌事件都有它的日期。 我需要一個查詢,讓我所有的用戶在去年沒有活躍。 我有以下查詢(工作查詢):從多個表中找到最近的日期mysql

SELECT * 
FROM (questions AS q 
    INNER JOIN Answers AS a 
    INNER JOIN bestAnswerByPoll AS p 
    INNER JOIN answerThumbRank AS t 
    INNER JOIN notes AS n 
    INNER JOIN interestingQuestion AS i ON q.user_id = a.user_id 
    AND a.user_id = p.user_id 
    AND p.user_id = t.user_id 
    AND t.user_id = n.user_id 
    AND n.user_id = i.user_id) 
WHERE DATEDIFF(CURDATE(),q.date)>365 
    AND DATEDIFF(CURDATE(),a.date)>365 
    AND DATEDIFF(CURDATE(),p.date)>365 
    AND DATEDIFF(CURDATE(),t.date)>365 
    AND DATEDIFF(CURDATE(),n.date)>365 
    AND DATEDIFF(CURDATE(),i.date)>365 

我在做什麼在查詢 - 加入所有表根據用戶id,然後檢查每個 日期列單獨看它是否被越來越那麼一年

我想知道是否有一種方法,使其更簡單,像找到最大所有日期間(最新的日期)和compering僅這一項爲當前日期

+1

閱讀有關'UNION',而不是'JOIN',也學會格式化你的代碼,以便它是可讀與對部分讀者毫不費力,因爲它站在一堆亂七八糟的東西不值得解析,給出一個完整的真實答案!沒有人會投入更多的努力來回答問題,而不是你提出的問題,在這一點上,這很少。 – 2013-04-27 19:19:17

回答

2

如果您想獲得最佳性能,則不能使用greatest()。相反,做這樣的事情:

SELECT * 
FROM questions q 
JOIN Answers    a ON q.user_id = a.user_id 
JOIN bestAnswerByPoll p ON a.user_id = p.user_id 
JOIN answerThumbRank  t ON p.user_id = t.user_id 
JOIN notes    n ON t.user_id = n.user_id 
JOIN interestingQuestion i ON n.user_id = i.user_id 
WHERE q.date > curdate() - interval 1 year 
    AND a.date > curdate() - interval 1 year 
    AND p.date > curdate() - interval 1 year 
    AND t.date > curdate() - interval 1 year 
    AND n.date > curdate() - interval 1 year 
    AND i.date > curdate() - interval 1 year 

你要避免datediff()使得MySQL能夠做日期列的比較索引查找。現在,爲確保索引查找能夠正常工作,您應該爲每個表創建(user_id, date)的複合(多列)索引。

在此複合索引中,第一部分(user_id)將用於更快的連接,第二部分(date)將用於更快的日期比較。如果您將SELECT *中的*替換爲上述列(僅限於user_id),則可能會獲得僅索引掃描,這將會超快。

UPDATE不幸的是,MySQL不支持WITH子句用於像PostgreSQL和一些其他數據庫的公共表表達式。但是,你仍然可以分解出常見的表現如下:

SELECT * 
FROM questions q 
JOIN Answers    a ON q.user_id = a.user_id 
JOIN bestAnswerByPoll p ON a.user_id = p.user_id 
JOIN answerThumbRank  t ON p.user_id = t.user_id 
JOIN notes    n ON t.user_id = n.user_id 
JOIN interestingQuestion i ON n.user_id = i.user_id, 
(SELECT curdate() - interval 1 year AS year_ago) x 
WHERE q.date > x.year_ago 
    AND a.date > x.year_ago 
    AND p.date > x.year_ago 
    AND t.date > x.year_ago 
    AND n.date > x.year_ago 
    AND i.date > x.year_ago 
+0

好的謝謝,我會試試看 – 2013-04-27 19:52:58

1

在MySQL中,可以使用greatest()功能:

WHERE DATEDIFF(CURDATE(), greatest(q.date, a.date, p.date, t.date, n.date, i.date)) > 365 

這將有助於提高可讀性。它不會影響性能。

+0

tnx!正是我所需要的 – 2013-04-27 19:32:28

相關問題