mysql选择未读邮件

gr8qqesn  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(244)

所以我尝试用查询选择未读邮件,但结果为空。我需要从一个单独的表读取信息,以便它会知道它是读或不。我试着做一些像if语句,所以如果readed不存在它将是未读的,但我不能得到修复
我的问题是:

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

我希望有人知道是什么问题!

w1e3prcc

w1e3prcc1#

对我来说,这个问题似乎是正确的,除了 OR ,所以我想问题出在数据上。我将首先尝试演示如何改进查询,然后尝试演示如何调试数据。
首先,让我们把这个问题撇开 OR 条件,因为这将无法在 JOIN ON 条款。
其次,在比较整型字段和值时,不应在值周围加引号。这只会让每个试图理解查询的人担心,因为引号表示字符串值,而且会让mysql的解析器担心(即减慢速度),因为它必须将字符串值转换为数字。
第三,混淆正常 WHERE 条件和 JOIN ON 情况令人担忧,作风恶劣(imho)。我总是建议只使用实际将表链接到 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 table。如果它不返回任何数据,那么就没有任何行匹配在一起,并且已经找到了问题的根源。
如果以上返回数据,则重新添加 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

以此类推,每次都测试查询。
这样,你就有希望找到问题所在。我确信问题出在数据上,而不是查询上。

相关问题