MySQL Cancel JOIN on CASE 不匹配

Posted

技术标签:

【中文标题】MySQL Cancel JOIN on CASE 不匹配【英文标题】:MySQL Cancel JOIN on CASE not matched 【发布时间】:2021-11-16 07:41:38 【问题描述】:

我有以下疑问:

SELECT u.id, u.name, n.other_user, n.notification FROM notifications n
INNER JOIN users u ON
CASE
  WHEN n.user = :me THEN u.id = n.other_user
  WHEN n.other_user = :me THEN u.id = n.user
  ELSE "CANCEL JOIN HERE"
END

对于上面的查询,我有这样的notification 表:

id user other_user notification
1 5 2 Text 1
2 3 3 Text 2
3 2 16 Text 3
4 0 0 Text 4
5 0 0 Text 5

现在假设我登录用户2。因此,我想用id1, 3, 4, 5 获取记录。这是因为记录1, 3userother_user 中都有用户2,记录4,5 是针对所有人的,因为它们没有分配给任何特定的用户ID(因为它们是0,0)。此外,当这些记录被选中时,它们不应加入users 表,因为没有 ID 为0 的用户。在这里,0 表示通知已发送给站点上的每个用户。它适合所有人。因此,我也想在使用0,0 选择这些记录时取消与users 表的连接。

现在,我当前的查询(没有ELSE 部分)只给我记录1,3 并忽略记录4,5。我相信这是因为这里使用了INNER JOIN。但我不能使用任何其他联接。我需要内部连接。如何在这里也选择记录4,5

【问题讨论】:

跳过 case 表达式,改用正则 AND / OR。 【参考方案1】:

使用单独的查询来获取其他记录,并将它们与UNION结合起来

SELECT *
FROM (
    SELECT u.id, u.name, n.other_user, n.notification FROM notifications n
    INNER JOIN users u ON
    CASE
      WHEN n.user = :me THEN u.id = n.other_user
      WHEN n.other_user = :me THEN u.id = n.user
    END
    
    UNION
    
    SELECT n.user, '', n.other_user, n.notification
    FROM notification n
    WHERE n.user = 0 AND n.other_user = 0
) AS x
ORDER BY x.id

【讨论】:

如何将ORDER BY 两者结合起来,以结构化的方式对两个查询进行降序排序? n.usern.other_user 之间的空白 '' 怎么样? UNION 中的所有查询都必须返回相同数量的列。这是这些不存在的名称的占位符。 请参阅***.com/questions/43742028/… 了解如何对 UNION 的结果进行排序。 哦,所以你的意思是说如果在第一个查询中我有 10 列,那么我第二个也需要有 10 列吗?另外,我需要根据第一个查询放置空白引号的顺序,这很重要吗?

以上是关于MySQL Cancel JOIN on CASE 不匹配的主要内容,如果未能解决你的问题,请参考以下文章

Mysql join 里面的case

left join on 和where中条件的放置位置

Linux下使用yum install时出现Exiting on user cancel

最全解释Mysql 的join中on与where 过滤条件差异

在 SQL/MySQL 中,join 语句中的“ON”和“WHERE”有啥区别?

mysql join 有多少种