SQL按随机顺序选择但不选择从特定列复制

问题描述 投票:0回答:1

好吧,我有我的数据库有多个广告...但我有来自同一网站的多个广告已添加....这是一个例子。

enter image description here

正如您所看到的......数据库有两个不同的链接......但它们通向同一个站点。我的目标是让它随机选择其中一个并显示它而不显示另一个,同时选择所有其他的并显示它们。这是我目前的编码:

<?php
$query = 'SELECT * FROM `ads`';
        $results = mysqli_query($connect, $query) or die(mysql_error());
        while ($row = mysqli_fetch_array($results, MYSQLI_ASSOC)) {
            extract($row);
            echo '
                <div class="col-sm-6">
                <div class="card mb-30"><a class="card-img-tiles" href="'.$link.'">
                    <div class="inner">
                      <div class="main-img"><img src="'.$image.'" alt="'.$alt_title.'"></div>
                    </div></a>
                  <div class="card-body text-center">
                    <h4 class="card-title">'.$name.'</h4>
                    '.$about.'
                    <a class="btn btn-outline-primary btn-sm" href="'.$link.'">Check It Out</a>
                  </div>
                </div>
              </div>
            ';
            }
?>

我希望它显示随机选择的带圆圈的那些,但不是每个都显示两者。

enter image description here

php mysql sql random
1个回答
1
投票

从MySQL版本8.0(或MariaDB 10.2)开始,您可以使用mainsite在具有相同ROW_NUMBER()的每组记录中选择一个随机记录,然后使用ORDER BY RAND()在外部查询中随机排序

SELECT * FROM (
    SELECT 
        t.*,
        ROW_NUMBER() OVER(PARTITION BY mainsite ORDER BY RAND()) rn
    FROM ads t
) x WHERE rn = 1
ORDER BY RAND()

使用早期版本的MySQL / MariaDB,这会变得更加繁琐。一种解决方案是使用一对变量来跟踪组并分配行号:

SELECT *
FROM (
    SELECT 
        a.*,
        CASE
            WHEN @mainsite != mainsite THEN @rn := 1
            ELSE @rn := @rn + 1
        END rn,
        @mainsite := mainsite
        FROM 
            (SELECT * FROM ads ORDER  BY RAND()) a
            CROSS JOIN (SELECT @rn := 0, @mainsite := NULL) r
        ORDER  BY a.mainsite
    ) s
WHERE  rn <= 1
ORDER  BY RAND()
© www.soinside.com 2019 - 2024. All rights reserved.