mysql - 删除除一个之外的所有记录,并且仅使用“类型”中的字段值
问题描述
我有一个在 php 中运行的 MySQL 脚本——它的作用是当用户登录时,它会删除所有旧令牌,除了最新的 3 个令牌。
DELETE tokens FROM tokens
LEFT JOIN (
SELECT id
FROM tokens
WHERE users_id = :user_id
ORDER BY access_time DESC
LIMIT 3) AS newest
ON tokens.id = newest.id
WHERE tokens.users_id = :user_id AND newest.id IS NULL
这非常有效,但是我尝试对其进行修改,使其仅适用于类型设置为“API”或“APP”的所有令牌
所以理论上,1 个用户可以在同一张表中拥有 3 个 API 令牌和 3 个 APP 令牌。
我试着改变这条线
WHERE tokens.users_id = :user_id AND newest.id IS NULL
到
WHERE tokens.users_id = :user_id AND newest.id IS NULL AND tokens.type = "API"
但是它似乎不起作用,事实上它根本没有返回任何结果......我做错了什么?
我的表中的字段如下:
令牌:id users_id token create_time type access_time
用户: id 电子邮件密码 活动验证 create_time
解决方案
你的想法只是有点错误。
您正在修改的WHERE
子句在DELETE
语句中,但您想更改保留的内容,而不是删除的内容。您要保留的行在FROM
子句的子查询中定义。所以这就是你想要放置新条件的地方。可能有一种更优雅的方法可以做到这一点,但是每个 3 个type
,我只使用了一个UNION
.
DELETE tokens
FROM tokens
LEFT JOIN
(
(SELECT id
FROM tokens
WHERE users_id =users_id AND tokens.type = "API"
ORDER BY access_time DESC
LIMIT 3)
UNION ALL
(SELECT id
FROM tokens
WHERE users_id =users_id AND tokens.type = "APP"
ORDER BY access_time DESC
LIMIT 3)
) AS newest
ON tokens.id = newest.id
WHERE
newest.id IS NULL;
这是一个有效的Rextester Demo。
推荐阅读
- r - 按相似名称重新组织 Dataframe 列
- c - C - `0` 特殊字符使用 malloc 出现
- java - 为什么 Java 无法读取某些包含 utf-8 字符的目录?
- docker - 在没有原始 Dockerfile 的情况下更新 docker 映像
- macos - 面向 macOS 的 Xamarin.Forms
- java - 如果重复,如何返回字符串的第一个字符?
- sql - 如何聚合基于列的多个条件以获得更好的性能?
- python - Python中的`import ab as b`和`b=ab`之间有什么区别吗?
- html - 带有网格和 ngFor 的离子模式
- typescript - Angular 6将可注射数组传递给app.module.ts中的提供者导致:“无法读取未定义的属性'长度'时出错”