Php 使用SQL SELECT查询返回最小用户数

Php 使用SQL SELECT查询返回最小用户数,php,mysql,sql,wordpress,wordpress-theming,Php,Mysql,Sql,Wordpress,Wordpress Theming,我对使用SQL有点陌生,我想知道是否有人能帮我解决这个问题。我正在开发一个Wordpress主题,我想在其中做的事情是使用SELECT查询在页面上生成一组随机的用户。它现在工作得很好,我让它从数据库中随机抽取用户,并以正确的格式显示他们。我甚至可以限制用户数量(使用limit子句)或按用户属性排序 然而,我的挑战是让查询返回至少4个用户(有时RAND()函数只会显示2个用户,这对于正面页面来说不是很好) 我不想创建一个查询,如果用户少于四个(这永远不会发生,但我仍然希望编写干净的代码),那么该查

我对使用SQL有点陌生,我想知道是否有人能帮我解决这个问题。我正在开发一个Wordpress主题,我想在其中做的事情是使用SELECT查询在页面上生成一组随机的用户。它现在工作得很好,我让它从数据库中随机抽取用户,并以正确的格式显示他们。我甚至可以限制用户数量(使用limit子句)或按用户属性排序

然而,我的挑战是让查询返回至少4个用户(有时
RAND()
函数只会显示2个用户,这对于正面页面来说不是很好)

我不想创建一个查询,如果用户少于四个(这永远不会发生,但我仍然希望编写干净的代码),那么该查询将抛出错误

因此,总而言之: 选择只返回4个结果的查询,随机排序,如果少于4个用户,则不会抛出错误

有什么想法吗?我尝试过使用几种不同的方法来为RAND()指定不同的参数,并查看是否有“minimum”子句,但我没有找到任何结果。这也是一个有点奇怪的问题,大多数时候我们更关心的是上限而不是下限

谢谢大家

下面是我在custom.php文件中的代码(我使用的是Roots starter主题):

函数wpb\u random\u users(){
全球$wpdb;
//查询数据库中的用户,通过更改限制来更改显示的用户数
$usernames=$wpdb->get_results(“从$wpdb->users ORDER BY RAND()LIMIT 4中选择用户名、用户url、用户电子邮件”);
//在列表中显示用户
foreach($username作为$username){
如果(!$username->user\u url):
$randomusers.='''user_电子邮件,'缩略图'。'alt=”“/>'.'.$username->user_nicename'.';
endif;
}
返回$0个用户;
}
添加_短码('randomusers','wpb_random_users');
您需要阅读rand()函数的描述。您不需要将参数传递给函数,只需执行以下操作:

$usernames = $wpdb->get_results("SELECT `user_nicename`, `user_url`, `user_email` FROM $wpdb->users ORDER BY RAND() LIMIT 4");
请记住,rand()函数无效,因此如果您有大量数据,则有更好的解决方案

为表中的每一行调用Rand()函数

如果您至少有4个用户,查询将返回他们

print_r($usernames);

SQL查询不是您得到少于4个结果的原因…如果表中至少有4行,则每次应该得到4个结果

我建议您调试这一行:
if(!$username->user\u url):
。您只显示没有url的用户。因此,如果您从SQL查询中获得4个用户,但其中只有两个缺少url,那么您只能获得2个用户


顺便说一句,你不需要为你正在做的事情设置
rand()
函数。事实上,这不太理想。只需使用
从$wpdb中选择user\u nicename、user\u url、user\u email->users ORDER BY rand()LIMIT 4“

以获取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;

忘了提一下:我已经试过了。因为rand()函数的方式。工作,它有时返回少于4个用户,这正是我试图克服的问题。您知道返回至少4个用户的另一种方法吗?如果您至少有4个用户,那么查询将显示他们。您可以在phpmyadmin中测试的查询中没有任何错误。您可以注意if子句,因为如果没有用户url,它将不会显示。如果robert是正确的。您不需要为rand()函数设置种子。阅读文档。此外,rand()不是您得到少于4个结果的原因。这是一个ORDERBY子句,而不是where子句。@John上面的答案在同一行之上;我试试看是否有效。因为忘记了那个情人而觉得很傻。谢谢更改了上面的代码以反映rand(),无需种子设定;事实上,我已经阅读了文档并发现了这一点,但在粘贴时还没有将其删除;对不起!:)编辑:我知道我不需要传递任何东西;删除传递的变量以反映我正在尝试的解决方案的当前状态。只是编辑以反映粘贴代码时留在其中的不必要变量(粘贴后我已将其从源代码中删除)。啊!!我认为你在URL问题上可能是对的;我会看看当他们都有URL时会发生什么。忘记那个参数了,谢谢!抢手货只是出于好奇;您是否知道有哪种情况可以返回最少数量的结果?尽管我现在知道这与我的问题无关,但我很好奇这是否是一个好的做法。MySQL将始终返回您请求的最大行数。如果表中的行数少于限制,则只返回小于限制的行数。。。所以,没有一种方法可以设置一个“最小…”值,如果MySQL没有足够的行给你,它需要给你两次相同的行,这是各种各样的问题。谢谢你的帮助!问题解决了。当使用if/else语句来确定是否存在用户URL时,罪魁祸首是函数版本的遗留物。通过移除if和end if(以及pa
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;