mysql - 排除列值上的连接记录?

标签 mysql sql postgresql join

例如,如果我有球和盒子,球可以在许多盒子中,并且盒子可以被锁定,我如何选择不在锁定盒子中的球?

balls
  id  name
  ==  ====
  1   in neither
  2   in unlocked
  3   in locked
  4   in both

boxes
  id  locked
  ==  ======
  1   0
  2   1

boxings
  ball_id box_id
  ======= ======
  2       1
  3       2
  4       1
  4       2

我使用左连接想出了这个,但它返回“在两个”球 我想排除它。

SELECT balls.* 
FROM balls 
LEFT OUTER JOIN boxings ON boxings.ball_id = balls.id 
LEFT OUTER JOIN boxes ON boxes.id = boxings.box_id 
WHERE (boxings.box_id IS NULL or boxes.locked = 0)
  AND boxes.id NOT IN (
    SELECT id FROM boxes WHERE locked = 1
    )

期望的结果:

id  name
==  ====
1   in neither
2   in unlocked

SQL fiddle : http://sqlfiddle.com/#!9/c26ab/4

最佳答案

我想你的意思是:选择永远不会在上锁的盒子里的球。

如果是这样,就会想到一个不存在查询:

select b.*
from balls b
where not exists (select 1
                  from boxings bxb join
                       boxes bo
                       on bxb.box_id = bo.id
                  where bxb.ball_id = b.id and bo.locked = 1
                 );

关于mysql - 排除列值上的连接记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40876963/

相关文章:

mysql - 从 MySQL 查询结果中计算子查询数量

mysql - Rails AR + Mysql - 排除电影类型无法按预期工作

c# - 对对象 'Notes'、数据库 'Sticky'、架构 'dbo' 的 SELECT 权限被拒绝

sql - PostgreSQL 是否保证唯一的时间戳?

mysql - 如何从表中的某一列中选择具有相同但随机值的行,而无需仅使用一个查询知道该值?

php - 为什么此 SQL 会出现语法错误?

sql - 从字符串 oracle 捕获的特殊字符和字符

sql - Rails Postgres 功能索引

php - PDO PostgreSQL 绑定(bind)错误

sql - PostgreSQL继承表和插入触发器