1

私はかなり複雑な通知システムを使用していますが、ほとんどの場合非常に単純で、コンテンツが削除されているかどうかを他のテーブルでチェックするのが複雑で、複数のデータテーブルがあります。通知システムなので、それぞれをチェックする必要があります。他の通知タイプを追加できるようにWebサイトを構築するときに、テーブルを簡単に追加できるようにする必要があります。現在のクエリでは、それを使用しています。それを許可していません、私はこれを行うためのより良い方法を考え出そうとしました、しかし私はそうするためのmysqlクエリで十分ではないので、私はいくつかを得ることができることを望んでいます(またはそれはたくさんあることが判明するかもしれません)あなたの一人(または何人か)による援助の。

これが私の現在のクエリです:

SELECT
    n.*,
    MIN(n.state) state,
    MIN(n.status) status,
    MAX(n.date) maxDate
FROM notifications n
LEFT JOIN comments c 
     ON n.type = 'comment' 
     AND n.uniqueID = c.id  
     AND c.state='0'
LEFT JOIN posts p 
     ON n.type = 'post' 
     AND p.id = n.uniqueID OR n.type = 'comment' 
     AND p.id = c.postID

WHERE n.toID = '$session'
AND p.state = 0
GROUP BY n.uniqueID
ORDER BY status ASC, maxDate DESC

つまり、上記のステートメントが行うことは、一言で言えば、これです。通知テーブルから通知を選択します。このテーブルには、そのコンテンツの列がtypeあります。uniqueIDしたがって、そのタイプの行ごとに、 from通知がpostsテーブルの一意のIDと同じpostsであるpostテーブルをチェックし、次にその投稿のをチェックして、削除されているかどうかを確認します(削除されていない場合)。削除されました、state = 0、それ以外の場合は必要ありません)。コメントについても同じことが言えます。uniqueIDstate

したがって、これと同じようにすべてを実行する方法が必要ですが、新しいテーブルチェックを継続的に追加しやすくする必要があります。likeと呼ばれるテーブルに別の左結合を追加しようとしていますが、何らかの理由でそれを一緒に機能させることができません。しかし、私はそれをやりたいことをするこのコードを思いついた。(ただし、likesテーブルの場合のみ、必要な他のテーブルは含まれません)

SELECT
    n.*,
    MIN(n.state) state,
    MIN(n.status) status,
    MAX(n.date) maxDate
FROM notifications n
LEFT JOIN likes l 
     ON n.type = 'likes' 
     AND n.uniqueID = l.id 
WHERE n.toID = '$session'
AND l.state='0'
GROUP BY n.uniqueID
ORDER BY status ASC, maxDate DESC

誰かがこの解決策を手伝ってくれることを願っています、よろしくお願いします!

4

1 に答える 1

2

「ANY」サブクエリを使用できるように見えます http://dev.mysql.com/doc/refman/5.0/en/any-in-some-subqueries.html

SELECT
    n.*,
    MIN(n.state) state,
    MIN(n.status) status,
    MAX(n.date) maxDate
FROM notifications n
WHERE n.toID = '$session' AND
    (
        (
            n.type = 'likes' AND
            n.uniqueID = ANY (
                SELECT likes.id
                FROM likes INNER JOIN posts on (likes.postId=posts.id)
                WHERE likes.state='0' and posts.state='0'
            )
        ) OR
        (
            n.type = 'comment' AND
            n.uniqueID = ANY (
                SELECT comments.id
                FROM comments INNER JOIN posts on (comments.postId=posts.id)
                WHERE comments.state='0' and posts.state='0'
            )
        ) OR
        (
            n.type = 'post' AND
            n.uniqueID = ANY (SELECT id FROM posts WHERE state='0')
        )
    )
GROUP BY n.uniqueID
ORDER BY status ASC, maxDate DESC;
于 2012-10-31T20:45:06.090 に答える