【问题标题】:DISTINCT and RND() on joined tables连接表上的 DISTINCT 和 RND()
【发布时间】:2021-12-15 05:04:58
【问题描述】:

我真的很困惑如何编写一个查询,该查询从我的 MySQL 数据库中的一个表中随机选择 50 个 DISTINCT 随机标题,然后从单独的表中从每个标题中选择 1 个随机摘录。第一个表是标题,第二个是摘录。

我尝试了两个嵌套在一起的查询,但这要么不起作用,要么返回重复的标题,尽管应该是 DISTINCT。

有人能帮我解决我哪里出错了吗?!

我现有的 PHP:

$distincttitlequery = “SELECT DISTINCT titleid FROM titles ORDER BY rand() LIMIT 50”;
$distincttitleresult = mysql_query($cxn,$distincttitlequery);
while ($distinctqueryreturn = mysqli_fetch_assoc($distincttitlequery))
{
extract ($distinctqueryreturn);
$selectedtitle = $titleid;

$randomexcerptquery = “SELECT excerpts.titleid, excerpts.excerptid, excerpts.excerptsynopsis, title.titleid, title.title FROM excerpts INNER JOIN titles ON excerpts.titleid=title.titleid WHERE titleid = ‘$selectedtitle’ ORDER BY rand() LIMIT 1”;
$randomexcerptresults = mysql_query($cxn,$randomexcerptquery);
while ($randomexcerptreturn = mysqli_fetch_assoc($randomexcerptquery))
{

[ECHO RESULTS HERE]

}};

我读过关于 GROUP BY 的类似帖子,但我需要创建一个查询来处理不同的、随机的和连接的表,我完全不知道从哪里开始!

我现有的代码在多个列上使用 DISTINCT 并连接表,但这会导致标题在返回的结果中重复。我可以忍受它,但我很想完善它!

提前感谢您对此提供的帮助。

【问题讨论】:

    标签: php mysql join random distinct


    【解决方案1】:

    在 mysql 8 中,您可以使用 row_number 为每个 titleid 获取 1 个随机行

    SELECT 
        titleid,title,excerptid,excerptsynopsis
        FROM (
    SELECT 
        e.titleid, e.excerptid, e.excerptsynopsis
        ,ROW_NUMBER() OVER( PARTITION BY e.titleid ORDER BY rand()) rn
        , t.title 
    FROM excerpts e 
    INNER JOIN (SELECT DISTINCT titleid FROM titles ORDER BY rand() LIMIT 50) t ON e.titleid=t.titleid 
    ) t1
    WHERE rn = 1
    

    【讨论】:

    • 不确定我的主机是否已经实现了 PHP8,但我真的很感激。这正是我想要的。
    • 如果你的版本比 mysql 8 旧,它会变得有点复杂,并且需要样本数据才能正确实现它
    • 我已经确认我的主机当前运行 PHP 7.3.27,所以我可能会等待他们升级它并部署您提供的解决方案。我不想仅仅因为我的编码中有一点强迫症,给你或其他人带来不便!!!
    • 你不明白我在说什么我的查询与 php 无关。 mysql 版本必须是 8.0.xx 才能使用窗口函数
    • 感谢您澄清我的愚蠢。应该更仔细地阅读您的回复!将在我的主机上检查他们正在运行的 MySQL 版本,并在必要时检查他们何时升级。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 2014-02-25
    • 2015-03-14
    • 1970-01-01
    相关资源
    最近更新 更多