当前位置: 首页 > 面试题库 >

MYSQL-仅当LEFT JOIN中的行不存在时选择

白子明
2023-03-14
问题内容

我有2个简单的mysql表。前1个称为mail,具有2行:

sender | receiver
Marley | Bob 
Saget  | Bob

第二个称为块,并具有1行:

blocker | blocked
  Bob   | Marley

我想从发送鲍勃电子邮件但未在阻止表中阻止的第一个表中选择发件人。因此结果应为:

sender 
 saget

我尝试了以下查询,但未返回结果:

SELECT * FROM mail  
LEFT JOIN block ON (block.blocker = 'Bob') 
WHERE (block.blocked <> mail.sender)

问题答案:

左联接将产生null不匹配的行。
这些null是您需要过滤的行。

SELECT * FROM mail  
LEFT JOIN block ON (block.blocker = 'Bob') 
WHERE block.blocker IS NULL

以固定值进行联接有点麻烦,但是(根据您的表)更常见的联接是:

SELECT * FROM mail  
LEFT JOIN block ON (block.blocker = mail.receiver
                and block.blocked = mail.sender)<<-- these should match
WHERE block.blocker IS NULL                     <<-- select only mismatches
AND mail.receiver like 'bob';


 类似资料:
  • 问题内容: 我有2张桌子- : 第二张桌子- : 我只需要选择未取消的预订(在此示例中仅为ID 3)。我可以轻松地选择带有简单条件的已取消,但由于未在此处取消工作,因此我在努力避免未取消。 问题答案: 要么: 第一个版本更直观,但是我认为第二个版本通常可以获得更好的性能(假设您在联接中使用的列上有索引)。 第二个版本有效,因为返回第一个表中所有行的一行。当条件成功,这些行会包括从第二表中的列,就像

  • 问题内容: 我想看看如何只获得具有唯一城市的唯一行/记录,而不关心是否是首都,例如: 只会返回一条记录。 我累了像这样的东西,但是没用 谢谢… 问题答案: 您可以使用以下仅用于mysql的技巧: 这将返回 遇到的第一行 的每个独特的价值和。 其他数据库将抱怨您的分组依据中未列出未聚合的列或此类消息。 已编辑 以前我声称不使用分组列上的函数将返回所有大小写的变化,但这是不正确的- 感谢SalmanA

  • 问题内容: 我需要将以下行添加到配置文件的末尾: 到一个名为 我正在寻找用于执行此操作的方法,但无法解决。 如果该行尚不存在,我将如何插入? 问题答案: 保持简单:) grep + echo 应该足够了: 安静 整行匹配 模式是一个普通的字符串 https://linux.die.net/man/1/grep 编辑:合并@cerin和@ thijs-wouters建议 。

  • 问题内容: 仅在不存在视图的情况下如何创建视图。如果确实存在,我想删除视图并重新定义它。我也不要警告或错误。 问题答案: 您将自己踢: 详细信息在这里。;-)

  • 根据对条件dplyr评估的讨论,我想根据传递的数据帧中是否存在参考列,有条件地在管道中执行一个步骤。 和生成的结果应该是相同的。 对于可用列,传递的对象与初始数据帧不对应。原始代码返回错误消息: :未找到对象 我尝试过其他语法(运气不佳): 我想扩展这个问题,以解释调用中右侧的评估。例如,下面的语法试图过滤第一个可用值。mtcars% 预期的是,调用的结果是错误消息: 中出错:结果的长度必须为32

  • 问题内容: 我需要帮助或想法如何编写它,一个mysql语句。当特定列的值更改时,我需要选择一行。此后具有相同值的行不应选择。例如,我们有一个像这样的表,用以下值填充: 如果我想在status_1更改时选择行,则查询应选择ID为1和5的行,如果我正在使用status_2的ID为:1、3、5、7的行,并且如果我使用status_3的所有ID,则为ID 。希望有人可以在过去的所有时间里为我提供帮助。 提