2016-10-22 53 views
-1

我花了两天时间来完成此查询,但最后...它无法正常工作。所以我为我的用户提供了消息系统,对于这个系统,我有两个表。消息和消息_身体。 表留言包含以下几列:用于计算未读消息的MySQL查询

ID | message_body_last | user_from | user_to | user_seen_status 

柱解释:

  • MESSAGE_BODY_LAST->的最后一条消息是,用户发送给其他
  • USER_TO - >邮件发送成功给用户...
  • USER_FROM - >该消息是发自...
  • USER_SEEN_STATUS->如果从user_to看到,我将值1,默认值为0.每当有人向另一个人发送消息 时,我将每个 时间的user_from和user_的值更改为有人发送给其他用户一条消息,并且列 user_seen_status是user_to列的组合,用于检查用户是否看到消息 。此表是消息的标题。

表messages_body是我放置用户之间所有对话的表。

MESSAGES_BODY是具有以下的列:

ID | MESSAGE_ID | MESSAGE_BODY | USER_FROM | USER_TO | USER_FROM_DELETE | USER_TO_DELETE 

名词解释:

  • ID - AI字段。
  • MESSAGE_ID是foreign_key到MESSAGES.ID
  • MESSAGE_BODY - 谁发送消息USER_FROM - - 从谁是消息
  • USER_FROM_DELETE - 如果有人删除一些邮件,或所有邮件消息
  • USER_TO的文本,我把这个用户的ID放在这里。
  • USER_TO_DELETE - 这是相同的字段。

所以,问题是:我想要计算有多少消息是新的。新消息是,如果我是ID 56的用户(这是我的测试ID), 我必须检查。是messages.user_to是56和user_seen_status是0,但我必须检查和一个更多的情况。在表MESSAGES_BODY中,列USER_FROM_DELETE和USER_TO_DELETE不包含我的ID(56)。因为如果我删除邮件,从其他用户计算新邮件是没有意义的。

这是我的查询:

SELECT messages.id, (SELECT COUNT(*) 
FROM messages 
WHERE user_to = 56 
AND user_seen_status = 0) as count_new_messages 
FROM messages 
LEFT JOIN messages_body 
ON messages_body.message_id = messages.id 
WHERE messages.user_to = 56 
AND messages.user_seen_status = 0 
AND (messages_body.user_from_delete <> 56 
AND messages_body.user_to_delete <> 56) 

查询工作,但如果我只有一个谈话...(表邮件,我只有一个排,用户之间的每个对话是一个MESSAGES_BODY中有多行) 如果我有更多的那个对话,COUNT(*)函数会向我返回两行数据相同的数据,并且无论第二个对话是否具有删除状态都无关紧要,他会显示我两条新消息。

如何获取新邮件的实数?

+0

请将您的解决方案作为下面的答案发布,并从标题中删除'[已解决]'。发布答案然后将其标记为已接受是向社区表明您的问题已得到纠正的最佳方式。 –

+0

好的,谢谢你的建议。 – ivant87

回答

-1

[解决]

后5分钟。更多,我得到我的错误。我从MESSAGES表中计数行,而不是从MESSAGES_BODY中计数。 这是我的工作查询,没有子查询。

SELECT messages.id, COUNT(messages_body.id) as count_value 
           FROM messages 
       LEFT JOIN messages_body 
        ON messages_body.message_id = messages.id 

       WHERE messages.user_to = 56 
       AND messages.user_seen_status = 0 
       AND messages_body.user_from_delete <> 56 
       AND messages_body.user_to_delete <> 56 

现在工作正是我想要的。

+1

在没有GROUP BY子句的情况下,这个答案没有多大意义。 – Strawberry

+0

我用GROUP BY尝试过,但结果并不是我正在寻找的。感谢-1 ... – ivant87

+0

不客气; downvote反映了这样的事实,即这个答案没有用(对自己或其他人)。 – Strawberry