2013-01-08 81 views
0

我有一個非常大的SQL查詢來檢查通知,並且我在表中有幾種不同類型的通知:IE,posts,likes,comments,photoComments,photoLikes,videoLikes (總是增加更多)而且我遇到了問題,我不確定如何最好地做到這一點。到目前爲止,我所做的工作方式是完美的,並且非常容易添加,但是這一個通知類型我必須檢查更多的其他表格,我必須檢查兩個其他表格,我不能檢查其他表格讓它工作。複雜的SQL查詢,檢查多個表中的列值

所以在這裏,它是:(這是我的巨大的查詢中,只有相關的部分真正的只是其中的一部分)

n.uniqueID = ANY (
       SELECT photos.id 
       FROM photos INNER JOIN posts ON (photos.id=posts.post) 
       WHERE photos.state=0 
       AND posts.state=0 
       AND posts.id = ANY (
            SELECT likes.postID FROM likes 
            INNER JOIN posts ON (posts.id=likes.postID) 
            WHERE likes.state=0 AND posts.state=0 
           ) 
       ) 

所以基本上我真正需要做的是檢查每個表,因爲state列說它是否被刪除(如果它不是0,那麼它被刪除,不應該返回) 所以它會像:

IF photos.state=0 AND posts.state=0 AND likes.state=0返回它。

  • n.uniqueIDposts.postphoto.id都將是相同的 值。
  • posts.idlikes.postID也將是相同的值。

我的問題是,它似乎沒有檢查likes.state,我不認爲。

+1

只是想到了這些 - 這些子查詢可能會變得非常昂貴。根據你的情況,如果可能的話,你可能會考慮做更多更小的查詢。這並不總是一個好建議,因爲它取決於你的具體情況,但是做2或3個查詢而不是一個深度嵌套的查詢通常會更有效率。 YMMV – Madbreaks

+0

感謝您的想法,我知道你在說什麼,但我花了很長時間重新編碼這個查詢這個特定的系統,這似乎是最好的/最簡單的方式,我和許多計算器用戶能夠出現。上面這個大的查詢只是這個特定查詢中的七個之一(並且正在增長)。 –

回答

1

我覺得你只是想三個表連接在一起在一個單一的查詢:

n.uniqueID = ANY (
       SELECT photos.id 
       FROM photos INNER JOIN 
        posts 
        ON photos.id=posts.post inner join 
        likes 
        on posts.id = likes.postId 
       WHERE photos.state=0 and 
        posts.state=0 and 
        likes.state = 0 
       ) 

您的邏輯是不返回時,有一個像或發佈與0的狀態,這似乎是那全部喜歡和帖子的狀態爲零。爲此,請使用having子句進行聚合:

n.uniqueID = ANY (
       SELECT photos.id 
       FROM photos INNER JOIN 
        posts 
        ON photos.id=posts.post inner join 
        likes 
        on posts.id = likes.postId 
       where photos.state = 0 
       group by photos.id 
       having MAX(posts.state) = 0 and MAX(likes.state) = 0 
+0

感謝這絕對是更少的代碼,我使用這個,問題仍然存在。這個問題仍然與喜歡,因爲它只有在具有相同postID的喜歡錶中有一行時,即使狀態設置爲1,但只有問題。我試圖更改查詢中的一行,但它不會任何東西。 'on posts.id = likes.postID AND likes.state = 0' –

+0

當我說它什麼也沒有做,我的意思是它仍然返回第一行的特定postID,即使它的狀態爲1 –

+0

'當狀態爲0時,你的邏輯不會返回'不,我只想返回狀態爲0的行。 –