MySQL选择未读消息

标签 mysql select inner-join

所以我尝试通过查询选择未读消息,但结果为空。我需要从单独的表读取信息,以便它知道它是否被读取。我正在尝试执行类似 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/

相关文章:

mysql - 在 phpMyadmin 中使用 SQL 查询更新一系列发布日期

mysql - SQL:链接两个表

javascript - jQuery - 根据输入链接中粘贴的链接选择一个选项

java - Hibernate hql 内连接

c# - 从两个表中获取不同记录的 Linq 查询

mysql - VB.Net 中的更新查询未更新

mysql 删除所有行并保留最新的 x [第 2 部分]

php - 变量值无法进入数据库

mysql - Perl DBI 的 'SELECT COUNT(*)' 返回什么?

php - 内连接查询建议