【发布时间】:2012-10-19 04:40:09
【问题描述】:
我正在开发一个相当复杂的通知系统,它在大多数情况下都非常简单,复杂性在于检查其他表是否内容已被删除,并且我有多个数据表全部进入通知系统,因此它必须检查每一个,并且我必须能够在构建网站时轻松添加更多表以允许添加其他通知类型,并且使用当前查询我正在使用它不允许这样做,我试图想出一个更好的方法来做到这一点,但是我对 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 的每一行,它会检查帖子表,其中通知中的 uniqueID 与帖子表中的唯一 ID 相同,然后检查该帖子的 state 以查看它是否有是否被删除(如果它没有被删除,state=0,否则我不想要它)。 cmets也是如此。
所以我需要一种方法来做所有事情,就像这样做一样,但是我需要更容易不断地向它添加新的表检查。我一直在尝试为一个名为 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
我希望有人可以帮助我解决这个问题,非常感谢您!
【问题讨论】:
标签: php mysql join mysqli left-join