gpt4 book ai didi

mysql - 在 SQL : Oldest records, 中排序但 x 行内没有重复值

转载 作者:行者123 更新时间:2023-11-29 02:31:12 24 4
gpt4 key购买 nike

我有一排照片要放在摄影网站的主页上。摄影师倾向于一次上传几十张照片,这意味着编辑选择最佳上传的照片很可能会将同一摄影师的几张照片一个接一个地放入队列中。但我们不希望一位摄影师连续几个小时拥有主页。

目前,我们手动对队列进行排序,使其尽可能按照排队时间顺序 (FIFO),但同一摄影师拍摄的两张照片之间的间隔不得超过五个。我们希望将其自动化。

我知道我们可以在 PHP 中进行排序,但是我们可以通过单个 MySQL 查询以正确的顺序检索队列吗?

表结构看起来像这样。我们通过交换两个相邻镜头的 queued_time 对队列进行排序 - 不太理想,但它有效:

homepage_queue
--------------
id INT NOT NULL
photo INT NOT NULL
queued_time INT NOT NULL

photos
------
id INT NOT NULL
photographer INT NOT NULL

浏览相关的 SO 问题抛出了这个页面,这似乎表明我需要模拟 Oracle 的 LAG 功能:http://onlamp.com/pub/a/mysql/2007/04/12/emulating-analytic-aka-ranking-functions-with-mysql.html?page=2

特别是当我考虑到我需要查看最后五行时,它看起来很乱,以至于我很想尖叫着逃跑并用 PHP 来完成它,但是我错过了更简单的方法吗?

我们通常将队列排满一周,每张照片一个小时,所以我们说的是外面可能有 200 条记录。

在队列的末尾肯定会有一些照片无法按照“五分开”规则进行排序。这无关紧要,因为我们可能每 24 小时运行一次该作业,并且随着稳定的上传流,队列的尾部一团糟也没关系。

最佳答案

我会在组合中添加另一个表,一个记录最近出现在您网站上的 5 位摄影师的表。

选择下一张照片的查询:

SELECT
homepage_queue.photo
FROM
homepage_queue
INNER JOIN
photos
ON photos.id = homepage_queue.photo
LEFT JOIN
(SELECT photographer, COUNT(*) AS occurances FROM last_five GROUP BY photographer) AS last_five
ON last_five.photographer = photos.photographer
ORDER BY
last_five.occurances ASC,
homepage_queue.queued_time
LIMIT
1

选好照片后:
- 将该值存储在某处
- 从 last_five
中删除最早的条目- 在 last_five 中添加一个与新照片的摄影师相关的新条目
- 从队列中删除所选照片

需要一些额外的维护,但解决方案相对简单并且可以 self 维护。

  • 如果队列中只有两名摄影师,他们会轮流
  • 如果新摄影师随后上传了几张照片,他们将获得优先权
  • 最近 5 次中出现次数最少的摄影师总是优先

编辑:

这通过仅关注下一步是什么?

简化了问题

您可以通过在循环中重复该过程 24 次来调整它以生成一个全新的队列。每次迭代,您都会将下一张照片 推送到您的新队列中。

您甚至可以一次生成 24 张照片的列表,然后每小时使用一次迭代:
- 删除一张照片
- 使用此方法添加一张照片

然后您就有了一个包含 24 张照片的固定列表,一种始终将“正确的照片”添加到列表末尾的方法,并且可以随时重新排列 24 张照片的列表。

关于mysql - 在 SQL : Oldest records, 中排序但 x 行内没有重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12941521/

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