mysql - 如何从MySQL表中查询复杂的 boolean 条件

标签 mysql boolean conditional-statements

我有下表用于个人消息:

id*    sender*    recipient* del_by_rec del_by_send
-+----------+-------------+-----------+-----------+
 2     tom        beth            0          1
 5     tom        josh            0          1
 5     tom        chris           1          1
 7     ashley     burt            1          0
 8     jenna      tom             1          0
 8     jenna      ashley          0          0
 8     jenna      jenna           1          0
10     ashley     burt            0          0

哪里

  • id 是消息 ID,
  • senderrecipient 是用户登录,
  • sender 对于消息 id 是唯一的
  • 一条消息 id 可以有多个收件人
  • 如果收件人已从收件箱中删除邮件,则 del_by_rec 为 1,并且
  • 如果发件人已从其发件箱中删除邮件,则del_by_send 为 1。
  • id-sender-recipient 是主键,
  • id 引用包含该消息的另一个表中的主键 id

一旦当前用户决定这样做,我需要确定是否可以安全地从表中删除消息:

来自收件人的收件箱:

  1. 如果发件人已从发件箱中删除邮件 (del_by_send = 1);和
  2. 如果该用户是唯一尚未从收件箱中删除此邮件的收件人(对于该用户,del_by_rec = 0;对于所有其他收件人,del_by_rec = 1 .)

或从发件人的发件箱:

  1. 如果所有收件人都已从收件箱中删除了此邮件(对于此邮件的所有收件人,del_by_rec = 1)。

否则,当前用户将通过将其相应的 del_by_recdel_by_send 标志设置为 1 来标记此消息以进行删除。

有没有办法有效地查询此条件

  1. 当前用户查看当前消息;或
  2. 当前用户批量删除多条消息(我认为在这种情况下将返回多行结果)。

如果能返回 boolean/int 那就太棒了。

看在我的份上,我无法通过这个查询(假设用户是 ashley 并且她想从收件箱中删除消息 8):

SELECT (
    (SUM(del_by_send) > 0) # sender has deleted (at least 1)
    && ((SUM(del_by_rec) + 1) >= COUNT(id)) # only 1 recipient has not deleted yet
    && ((SELECT del_by_rec FROM msg_meta WHERE recipient = 'ashley' AND id = 8) = 0) # and that recipient is this user
)
FROM msg_meta
WHERE id = 8
GROUP BY id
  1. 这似乎可以完成任务,但是有点矫枉过正吗?
  2. 对于多个消息 id 来说,这会失败,以避免昂贵的 foreach。我尝试了 WHERE id IN (7,10) 作为收件人 burt,但我无法完全将其放入子查询中。

帮助。谢谢大家..

最佳答案

我的建议是使用子查询在消息级别获取所需的信息,然后对此应用逻辑。以下查询很接近:

select id, (case when sum_del_by_send > 0 and (num_rec - sum_del_by_rec) <= 1
                 then 'Y'
                 else 'N'
            end) as IsSafeToDelete
from (select id,
             sum(del_by_send) as sum_del_by_send,
             sum(del_by_rec) as sum_del_by_rec,
             count(*) as num_rec
      from msg_meta
      group by id
     ) m

这不会考虑当前收件人。这个变体的作用是:

select id, (case when sum_del_by_send > 0 and (num_others - sum_del_by_others) = 1
                 then 'Y'
                 else 'N'
            end) as IsSafeToDelete
from (select id,
             sum(del_by_send) as sum_del_by_send,
             sum(case when recipient <> @RECIPIENT then del_by_rec end) as sum_del_by_others,
             sum(case when recipient <> @RECIPIENT then 1 else 0 end) as num_others,
             count(*) as num_rec
      from msg_meta
      group by id
     ) m

这会同时处理所有消息。要处理特定的消息 id,只需将子查询中的“group by id”替换为:

where id = @ID

(@RECIPIENT 和 @ID 是您要为其自定义查询的值。)

关于mysql - 如何从MySQL表中查询复杂的 boolean 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11882115/

相关文章:

Mysqldump'不被识别为内部或外部命令可操作程序或批处理文件

php - mysql IN() 函数或 FIND_IN_SET 函数中允许的最大逗号分隔字符串

c - C 中的 boolean 函数

php - 如何解压来自 Qt 结构/字符串的 PHP 中的 boolean 值

java - BigInteger.intValue()>1 给出错误的 boolean 值

sql - 条件结合

javascript - 如何创建动态 if 条件

php - 获取任意 mysql select 语句的计数(在 PHP 中),而不获取整个结果

mysql - 只安装mysql客户端可以连接mysql服务器吗?

javascript - 是或否而不是 knockout 中的真或假