【问题标题】:MySQL Cancel JOIN on CASE not matchedMySQL Cancel JOIN on CASE 不匹配
【发布时间】: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。

标签: mysql sql join case


【解决方案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 中的所有查询都必须返回相同数量的列。这是这些不存在的名称的占位符。
  • 请参阅stackoverflow.com/questions/43742028/… 了解如何对 UNION 的结果进行排序。
  • 哦,所以你的意思是说如果在第一个查询中我有 10 列,那么我第二个也需要有 10 列吗?另外,我需要根据第一个查询放置空白引号的顺序,这很重要吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
  • 2012-04-02
  • 1970-01-01
相关资源
最近更新 更多