MySQL结合了复杂的查询和优化功能

时间:2012-10-29 20:08:57

标签: php mysql join mysqli left-join

我有一个相当复杂的通知系统正在处理,它在很大程度上非常简单,复杂性会检查其他表是否已删除内容,并且我有多个数据表,所有进入通知系统,所以它必须检查每一个,我必须能够轻松地添加更多的表,因为我建立网站,以允许添加其他通知类型,并与当前查询我我正在使用它不允许这样做,我试图想出一个更好的方法来做到这一点,但是我不能用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的内容。因此,对于每个类型为posts的行,它会检查post表,其中来自通知的uniqueID与posts表中的唯一ID相同,然后它会检查state发布以查看是否已被删除(如果尚未删除,则状态= 0,否则我不想要它)。评论也是如此。

所以我需要一种方法来做这样的事情,但是我需要它更容易连续添加新的表检查。我一直试图为一个名为“喜欢”的表添加另一个左连接,但无论出于何种原因,我都无法让它一起工作。但是我已经提出了这个代码,它会做我想要的。 (但是对于喜欢的表,它不包括我需要它的任何其他表)

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

我希望有人可以帮我解决这个问题,非常感谢你!

1 个答案:

答案 0 :(得分: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;