gpt4 book ai didi

php - 对于在一个查询中表中具有相关行的每个客户端,删除所有行,但最后 10 行除外?

转载 作者:行者123 更新时间:2023-11-29 01:27:22 27 4
gpt4 key购买 nike

所以我的情况是这样的:

Clients 表 - 有客户数据等,不太令人兴奋

Recently Viewed table - 最近为客户查看过的表,结构如下:

( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
, client_id INT NOT NULL
, cookie_user_id INT NOT NULL
, hotel_id INT NOT NULL
, added DATETIME NOT NULL
, comment TEXT
,status TINYINT NOT NULL DEFAULE 1
);

我目前有一个部分工作的 SQL 来删除最近查看的表中的行,该表现在全局限制其中最新剩余未删除记录的数量。这是现在的样子

DELETE FROM `recently_viewed`
WHERE `recently_viewed`.`id` NOT IN (
SELECT id
FROM (
SELECT `id`
FROM `recently_viewed`
WHERE `client_id` IN (SELECT `id` FROM `klijenti`)
ORDER BY `id` DESC
LIMIT 5
) x
)
AND `client_id` <> 0

“LIMIT 5”部分应限制为保留在“每个客户”的最近查看表中的 N 条记录。现在它将最近查看的表中的记录限制为 5,无论有多少客户实际在那里有记录。因此,如果我有 10 个客户,每个客户在该表中都有 8 条记录,我希望此查询根据需要删除尽可能多的最旧记录,以便为每个客户只保留 5 个最近查看的项目,而不仅仅是在表中总共保留 5 个,忽略“每个客户”的逻辑。希望这对你有意义:)

目前,如果我首先获取应用程序中的所有客户,然后执行一个 foreach 循环以对每个客户进行另一个查询并保留他最近查看的 5 个项目,那么这个查询就可以了,但我想在一个 SQL 查询。

这怎么可能?谢谢

最佳答案

你可以这样做:

DELETE FROM `recently_viewed`
WHERE `recently_viewed`.`id` NOT IN (
SELECT id
FROM (
SELECT t.`id`,count(*) as rnk
FROM `recently_viewed` t
INNER JOIN `recently_viewed` s
ON(t.`client_id` = s.`client_id` and t.added <= s.added)
WHERE t.`client_id` IN (SELECT `id` FROM `klijenti`)
GROUP BY t.`ID`
) x
WHERE rnk <= 5
)
AND `client_id` <> 0

关于php - 对于在一个查询中表中具有相关行的每个客户端,删除所有行,但最后 10 行除外?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35843462/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com