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];
这是我想要实现的目标:
我想显示四个类别中最新帖子的随机条目。
我试过将 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];