我有一个相当复杂的通知系统正在处理,它在很大程度上非常简单,复杂性会检查其他表是否已删除内容,并且我有多个数据表,所有进入通知系统,所以它必须检查每一个,我必须能够轻松地添加更多的表,因为我建立网站,以允许添加其他通知类型,并与当前查询我我正在使用它不允许这样做,我试图想出一个更好的方法来做到这一点,但是我不能用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
的内容。因此,对于每个类型为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
我希望有人可以帮我解决这个问题,非常感谢你!
答案 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;