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
。因此,我想用id
1, 3, 4, 5
获取记录。这是因为记录1, 3
在user
和other_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.user
和 n.other_user
之间的空白 ''
怎么样?
UNION 中的所有查询都必须返回相同数量的列。这是这些不存在的名称的占位符。
请参阅***.com/questions/43742028/… 了解如何对 UNION 的结果进行排序。
哦,所以你的意思是说如果在第一个查询中我有 10 列,那么我第二个也需要有 10 列吗?另外,我需要根据第一个查询放置空白引号的顺序,这很重要吗?以上是关于MySQL Cancel JOIN on CASE 不匹配的主要内容,如果未能解决你的问题,请参考以下文章
Linux下使用yum install时出现Exiting on user cancel
最全解释Mysql 的join中on与where 过滤条件差异