好吧,我有我的数据库有多个广告...但我有来自同一网站的多个广告已添加....这是一个例子。
正如您所看到的......数据库有两个不同的链接......但它们通向同一个站点。我的目标是让它随机选择其中一个并显示它而不显示另一个,同时选择所有其他的并显示它们。这是我目前的编码:
<?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>
';
}
?>
我希望它显示随机选择的带圆圈的那些,但不是每个都显示两者。
从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()