1

我正在开发一个相当复杂的通知系统,它在大多数情况下非常简单,复杂性在于检查其他表是否内容已被删除,并且我有多个数据表都进入通知系统,因此它必须检查每一个,并且我必须能够在构建网站时轻松添加更多表以允许添加其他通知类型,并且我正在使用当前查询不允许这样做,我试图想出一个更好的方法来做到这一点,但是我对 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

简而言之,上述语句的作用就是这样。它从通知表中选择通知,在此表中有一个用于typeuniqueID内容的列。因此,对于类型为 is 的每一行,posts它都会检查 post 表,其中uniqueIDfrom 通知与 posts 表中的唯一 id 相同,然后检查该帖子的 idstate以查看它是否已被删除(如果没有被删除,state=0,否则我不想要它)。评论也是如此。

所以我需要一种方法来做所有事情,就像这样做一样,但是我需要它更容易不断地向它添加新的表检查。我一直在尝试为一个名为 likes 的表添加另一个左连接,但是无论出于何种原因,我都无法让它一起工作。但是我想出了这个代码,它可以做我想做的事情。(虽然仅适用于 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 回答