MySQL 来自一系列最新条目的 RAND() (ORDER BY id DESC LIMIT 0,1) – 这可能吗?

MySQL RAND() from a range of latest entries (ORDER BY id DESC LIMIT 0,1) – Is this possible?

这是我想要实现的目标:

我想显示四个类别中最新帖子的随机条目。

我试过将 RAND()ORDER BY contentID DESC LIMIT 0,1 结合使用,但这不起作用:

SELECT cc.pageID, cc.contentID, cc.contentTitle, cc.contentDate, cc.contentImage, cc.contentText, cs.pageName, cs.pageLabel_".$lang." AS pageLabel, cs.pageImage, ca.authorImage 
FROM cheeseus_content cc 
JOIN cheeseus_sections cs ON cc.pageID = cs.pageID 
JOIN cheeseus_authors ca ON cc.contentAuthor = ca.authorID 
WHERE cc.pageID IN (18, 19, 20, 21) 
ORDER BY RAND(), cc.contentID DESC LIMIT 0,1

我正在寻找的东西是否可行以及如何实现?

假设您是 运行 MySQL 8 或更高版本,您可以使用 ROW_NUMBER:

WITH cte AS (
    SELECT cc.pageID, cc.contentID, cc.contentTitle, cc.contentDate,
           cc.contentImage, cc.contentText, cs.pageName,
           cs.pageLabel_".$lang." AS pageLabel, cs.pageImage, ca.authorImage,
           ROW_NUMBER() OVER (PARTITION BY cc.pageID ORDER BY RAND()) rn
    FROM cheeseus_content cc
    INNER JOIN cheeseus_sections cs ON cc.pageID = cs.pageID
    INNER JOIN cheeseus_authors ca ON cc.contentAuthor = ca.authorID
    WHERE cc.pageID IN (18, 19, 20, 21)
)

SELECT *
FROM cte
WHERE rn = 1;

以下是我想出的解决方案。它依赖于 PHP 而不是 MySQL 但可以完成工作。

我将我想要的最新条目的类别 ID 放入一个数组中。然后使用 foreach 执行所需的查询。之后,我将查询结果放入一个多维数组中。在 foreach 循环之外,我使用 array_rand 从多维数组元素中获取随机 ID。然后select从随机选择的子数组中得到查询结果。

// random entry from latest translations from four categories
$transPagesArray = array(18, 19, 20, 21);
foreach($transPagesArray as $transPagesID) {
    $latestTransQuery = $this->conn->prepare("SELECT cc.pageID, cc.contentID, cc.contentTitle, cc.contentDate, cc.contentImage, cc.contentText, cs.pageName, cs.pageLabel_".$lang." AS pageLabel, cs.pageImage, ca.authorImage FROM cheeseus_content cc JOIN cheeseus_sections cs ON cc.pageID = cs.pageID JOIN cheeseus_authors ca ON cc.contentAuthor = ca.authorID WHERE cc.pageID = ".$transPagesID." ORDER BY cc.contentID DESC LIMIT 0,1");
    $latestTransQuery->execute();
    $latestTransArray[] = $latestTransQuery->fetch(\PDO::FETCH_ASSOC);
}
// choose one random entry from the latest entries array
$randomTrans = array_rand($latestTransArray);
$latestTrans = $latestTransArray[$randomTrans];