【问题标题】:MySQL select unreaded messagesMySQL 选择未读消息
【发布时间】:2019-02-07 06:36:35
【问题描述】:

所以我试图通过查询选择未读邮件,但结果为空白。我需要从一个单独的表中读取信息,以便它知道它是否被读取。我正在尝试做类似 IF 语句的事情,所以如果读取不存在,它将是未读的,但我无法修复它

这是我的查询:

 SELECT * FROM notify 
 INNER JOIN readed ON readed.acc_ID = '26' AND readed.user_ID = '6' 
        AND readed.msg_ID = notify.ID AND readed.readed != '1' OR readed.ID IS NULL 
 WHERE notify.groep = '1'


DB - readed

ID         - int
user_ID    - int
acc_ID     - int
msg_ID     - int
readed     - enum ('0','1')

DB - notify

ID         - int
notfi      - text
thumb_src  - text
title      - text
url        - text
groep      - int

希望有人知道问题所在!

【问题讨论】:

标签: mysql select inner-join


【解决方案1】:

这个查询对我来说似乎是正确的,除了OR 的部分,所以我认为问题出在数据上。我将首先尝试展示如何改进查询,然后尝试展示如何调试数据。

首先,让我们放弃OR 条件,因为这在JOIN ON 子句中不会按预期工作。

其次,在将整数字段与值进行比较时,不应在值周围加上引号。这只会让每个试图理解查询的人担心,因为引号表示 string 值,并且会担心(即减慢)MySQL 的解析器,因为它必须将字符串值转换为数字。

第三,将正常的WHERE 条件和JOIN ON 条件混为一谈令人担忧且作风不好(恕我直言)。我始终建议将仅将实际链接表的条件放入JOIN ON 子句,并将其他条件放在其他地方。

遵循这个建议会导致类似的结果:

SELECT * FROM
  notify INNER JOIN readed ON
    readed.msg_ID = notify.ID
WHERE
  readed.acc_ID = 26 AND
  readed.user_ID = 6 AND
  readed.readed != '1' AND
  notify.groep = 1

这应该与您的原始查询减去OR 部分相同。

现在,既然我们怀疑数据有问题,我们就可以开始调试数据了。首先,去掉WHERE 子句:

SELECT * FROM
  notify INNER JOIN readed ON
    readed.msg_ID = notify.ID

如果这返回数据,那么您至少知道readed 表中有与notify 表中的行匹配的行。如果它没有返回任何数据,那么就没有可以组合在一起的行,并且已经找到了问题的根源。

如果以上返回数据,则逐行重新添加WHERE子句,并在每一步之后测试。例如,以

开头
SELECT * FROM
  notify INNER JOIN readed ON
    readed.msg_ID = notify.ID
WHERE
  readed.acc_ID = 26 AND

然后继续

SELECT * FROM
  notify INNER JOIN readed ON
    readed.msg_ID = notify.ID
WHERE
  readed.acc_ID = 26 AND
  readed.user_ID = 6 AND

以此类推,每次都测试查询。

这样,您有望找出问题所在。我确信问题出在数据上,而不是查询上。

【讨论】:

  • 我已经尝试了你上面所说的一切。一切似乎都有效,但我仍然得到 0 个结果。我自己认为问题在于在用户阅读之前已阅读不存在。但我不知道如何使用 if not exists 跳过询问数据库用户是否已阅读它。
  • SELECT * FROM readed 是否给出任何结果? “已读不存在”是什么意思?
  • 已读取存在,但在用户看到收件箱之前我从未将数据插入其中。
  • 所以试图让它与类似 IF 读取 NOT EXISTS 值 user_ID = 6 AND acc_ID = 26 THEN 用户没有看到它,所以我显示消息
  • SELECT * FROM readed 没有结果,因为它还没有,我不知道如何排列所有用户 ID 并将其保存在数据库中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 2020-06-09
  • 2013-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多