MySQL 用于根据 uuid 加入表并忽略两个表中都存在的 uuid

ina*_*ina 0 mysql anti-join

我试图找出如何最好地编写一个省略返回maintable用户 ( uuid_user) 已经看到 ( seentable) 的行 ( ) 的语句。用户已经看到的行存储在seentable. 这是我的表格的简化版本。uuid用作加入的密钥。uuid_user标识特定用户看到的行。

不太有效:

SELECT * 
  FROM maintable 
  JOIN seentable 
    on maintable.uuid = seentable.uuid 
 WHERE maintable.uuid != seentable.uuid
Run Code Online (Sandbox Code Playgroud)
maintable
uuid (char36)
lng,lat (POINT)
timestamp (timestamp)

seentable 
uuid (char36)
uuid_user (char36)
timestamp (timestamp)
Run Code Online (Sandbox Code Playgroud)

Tim*_*sen 6

如果您想坚持使用连接方法,那么您可以使用左反连接:

SELECT m.*
FROM maintable m
LEFT JOIN seentable s ON m.uuid = s.uuid
WHERE s.uuid IS NULL;
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用存在逻辑来表达这一点:

SELECT m.*
FROM maintable m
WHERE NOT EXISTS (SELECT 1 FROM seentable s WHERE s.uuid = m.uuid);
Run Code Online (Sandbox Code Playgroud)