【问题标题】:MySQL omitting rows a user has already seen from checking a "seen" tableMySQL 省略了用户在检查“已看到”表时已经看到的行
【发布时间】:2021-05-24 07:22:20
【问题描述】:

我试图弄清楚如何最好地编写一个语句,该语句省略用户 (uuid_user) 已经看到 (seentable) 的返回行 (maintable)。

  • 问:我应该让“seen”表成为每个用户的单独表吗?

目前,我将它作为一个供所有用户使用的 seen

对于每个uuid_user,用户已经看到的行存储在seentable 中。这是我的表格的简化版本。 uuid 用作加入的密钥。 uuid_user 标识特定用户看到的行。

不太好用:

SELECT * 
  FROM maintable m 
 LEFT JOIN seentable s 
    on m.uuid = s.uuid 
 WHERE s.uuid IS NULL and s.uuid_user = '[user]'
maintable
uuid (char36)
lng,lat (POINT)
timestamp (timestamp)

seentable 
uuid (char36)
uuid_user (char36)
timestamp (timestamp)

【问题讨论】:

    标签: mysql join database-design anti-join


    【解决方案1】:

    您需要将uuid_user 的限制从WHERE 子句移至join 的ON 子句:

    SELECT * 
    FROM maintable m 
    LEFT JOIN seentable s 
        ON m.uuid = s.uuid AND s.uuid_user = '[user]'
    WHERE s.uuid IS NULL;
    

    上面是你想要的逻辑。现在,只要 uuid 值匹配 ,当看到的表中的 uuid_user 值匹配某个值时,两个表中的记录之间就会成功连接。请注意,如果 uuid_user 匹配任何记录,它不会被过滤掉,这就是您当前查询的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-19
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多