我的mysql模式中有这个表:
id | user_id | cellphone_id | favorited_at | unfavorited_at
1 | 234 | 7 | 2019-04-09 12:35:02 |
2 | 234 | 5 | 2019-04-09 13:00:02 |
4 | 234 | 7 | 2019-04-09 12:35:02 | 2019-04-10 12:35:02
此表表示应用程序用户收藏的所有手机的历史记录。
在上面的示例中,cellphone_id 7 在 2019-04-09 是收藏夹,之后在 2019-04-10 是不喜欢的。
所以我想构建一个查询来选择用户此时喜欢的所有手机,所以当我运行查询时,结果应该是这样的:
SELECT * FROM favorite_user_cellphone
WHERE user_id = 234 AND <something.....>
结果应该是:
id | user_id | cellphone_id | favorited_at | unfavorited_at
2 | 234 | 5 | 2019-04-09 13:00:02 |
应该只返回 5 cellphone_id,因为cellphone_id 7 被收藏,之后是取消收藏的。
NOT EXISTS
查询:
SELECT *
FROM t
WHERE unfavorited_at IS NULL
AND NOT EXISTS (
-- t is a favorited record
-- x is an unfavorited record that is more recent than t
SELECT 1
FROM t AS x
WHERE user_id = t.user_id
AND cellphone_id = t.cellphone_id
AND unfavorited_at > t.favorited_at
)
对于单个用户,我认为您可以使用order by
和limit
:
SELECT uc.*
FROM favorite_user_cellphone uc
WHERE user_id = 234 AND <something.....>
ORDER BY favorited_at DESC
LIMIT 1;
Select * from
favorite_user_cellphone uc
where user_id = 234 and favorited_at is not null And cellphone_id not in
(
Select cellphone_id from
favorite_user_cellphone uc
where user_id = 234 and unfavorited_at is not null)
使用它
从favorite_user_cellphone中选择 *,其中 user_id = 234 而不是 FROM(从favorite_user_cellphone中选择 cellphone_id,其中 user_id = 234 且unfavorited_at不为空(