0

通知をチェックするための非常に巨大なSQLクエリがあり、テーブルにはいくつかの異なるタイプの通知があります。IE:投稿、いいね、コメント、photoComments、photoLikes、videoLikesなど(常に追加します)問題が発生した場合、これを行う最善の方法がわかりません。これまでのところ、これまでの方法は完璧に機能しており、追加するのは非常に簡単ですが、この1つの通知タイプでは、他の1つのテーブル以上をチェックする必要があり、他の2つのテーブルをチェックする必要があります。それを機能させる。

だからここにあります:(これは私の巨大なクエリの一部であり、実際に関連する唯一の部分です)

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.uniqueID、、、posts.postおよびphoto.idはすべて同じ値になります。
  • posts.idまたlikes.postID、同じ値になります。

私の問題は、それがチェックしていないようだということですlikes.state、私は思いません。

4

1 に答える 1

1

1つのクエリで3つのテーブルを結合したいだけだと思います。

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のlikeまたはpostがある場合、ロジックは戻りません。すべてのlikeおよびpostの状態が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
于 2013-01-08T19:37:38.743 に答える