我对使用SQL有点新意,并且想知道是否有人可以帮我解决这个问题,我想弄清楚。我正在开发一个Wordpress主题,我想在其中做的是使用SELECT查询在页面上生成一组随机用户。它现在很好用,我随机从数据库中提取用户并使用正确的格式显示它们。我甚至可以限制用户数量(使用LIMIT子句)或按用户属性排序。
但是,我的挑战是让查询返回至少4个用户(有时RAND()
函数只会显示2个,这对于前向页面来说并不好。
我不想创建一个如果用户少于四个就会抛出错误的查询(这将永远不会,但我仍然希望编写干净的代码)。
所以,总结一下: SELECT查询,返回4个结果,随机排序,如果用户少于4个,则不会抛出错误。
有什么想法?我尝试使用几种不同的方法来给出RAND()不同的参数,并查看是否有'最小'子句,但我没有找到任何东西。这也是一个奇怪的查询bc大多数时候我们更关心的是上限而不是下限。
谢谢大家!
这是我在custom.php文件中的代码(我使用的是Roots启动主题):
function wpb_random_users() {
global $wpdb;
// Query database for users, change the number of users displayed by changing the limit
$usernames = $wpdb->get_results("SELECT user_nicename, user_url, user_email FROM $wpdb->users ORDER BY RAND() LIMIT 4 ");
// Display users in a list
foreach ($usernames as $username) {
if (!$username->user_url) :
$randomusers .= '<div class="col-md-3">'.'<img class="img-circle img-responsive" src="'.get_wp_user_avatar_src($username->user_email, 'thumbnail').'" alt="" />'.'<h4>'.$username->user_nicename.'</h4>'.'</div>';
endif;
}
return $randomusers;
}
add_shortcode('randomusers','wpb_random_users');
答案 0 :(得分:2)
SQL查询不是您获得少于4个结果的原因...如果表格中至少有4行,您应该每次获得4个。
我建议您调试此行:if (!$username->user_url) :
。您只显示没有URL的用户。因此,如果从SQL查询中返回4个用户,但只有两个用户没有URL,则只能获得2个用户。
顺便说一句,您不需要为rand()
函数播种您正在做的事情。事实上,它不太令人满意。只需使用SELECT user_nicename, user_url, user_email FROM $wpdb->users ORDER BY RAND() LIMIT 4 ");
答案 1 :(得分:0)
您需要阅读rand()函数说明。您不需要将参数传递给函数:
$usernames = $wpdb->get_results("SELECT `user_nicename`, `user_url`, `user_email` FROM $wpdb->users ORDER BY RAND() LIMIT 4");
请记住,rand()函数无效,因此如果您有大量数据,则有更好的解决方案。
为表中的每一行调用Rand()函数。
如果您有至少4个用户,则查询将返回它们。您可以在foreach
之前调试以查看以下代码print_r($usernames);
答案 2 :(得分:0)
要在SQL中获得随机排序:
select a, b, c
from(
select a, b, c, rand() OrderBy
from tablename
)
order by OrderBy;
这将以随机顺序为您提供表转储。您只需要最多4行。有两个地方可以设置限制,结果将根据您放置的位置而有所不同。
select a, b, c
from(
select a, b, c, rand() OrderBy
from tablename
limit 4
)
order by OrderBy;
这将给你相同的4行,只是拖着脚走。
select a, b, c
from(
select a, b, c, rand() OrderBy
from tablename
)
order by OrderBy
limit 4;
这将为您提供整个表中的4个随机行。这似乎是你想要的,但它仍然不是很有效,因为它也必须扫描整个表。折衷方案是将内联视图限制为一个合理的集合,该集合提供至少4行但不是太多,以至于非常低效。假设内联视图生成40行。这意味着以下内容将从同一组40中抽取4个随机行。这可能足以满足您的需求。
select a, b, c
from(
select a, b, c, rand() OrderBy
from tablename
where some-limiting-factor -- generates about 40 rows
)
order by OrderBy
limit 4;