所以我尝试通过查询选择未读消息,但结果为空。我需要从单独的表读取信息,以便它知道它是否被读取。我正在尝试执行类似 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
我希望有人知道问题出在哪里!
最佳答案
该查询对我来说似乎是正确的,除了带有 OR
的部分,所以我认为问题出在数据上。我将首先尝试展示如何改进查询,然后尝试展示如何调试数据。
首先,让我们忽略 OR
条件,因为这在 JOIN ON
子句中不会按预期工作。
其次,在将整数字段与值进行比较时,不应在值两边加上引号。这只会让每个试图理解查询的人担心,因为引号表示字符串值,并且它还会担心(即减慢)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
依此类推,每次都测试查询。
这样,您就有希望找出问题所在。我确信问题出在数据上,而不是查询上。
关于MySQL选择未读消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52128821/