【问题标题】:Use SQL SELECT query to return a minimum number of users使用 SQL SELECT 查询返回最小用户数
【发布时间】:2014-07-16 18:28:59
【问题描述】:

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

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

我不想创建一个在少于四个用户时会抛出错误的查询(永远不会,但我仍然想编写干净的代码)。

所以,总而言之: SELECT 查询恰好返回 4 个随机排序的结果,并且如果用户少于四个,则不会引发错误。

有什么想法吗?我尝试使用几种不同的方法来给 RAND() 不同的参数,并查看是否有“最小”子句,但我没有找到任何东西。这也是一个奇怪的查询,因为大多数时候我们更关心上限而不是下限。

谢谢大家!

这是我在 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');

【问题讨论】:

  • 编辑:我知道我不需要传递 RAND() 任何东西;删除传递的变量以反映我正在尝试的解决方案的当前状态。

标签: php mysql sql wordpress wordpress-theming


【解决方案1】:

您需要阅读 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);

【讨论】:

  • 忘了说:我已经试过了。由于 rand() 函数的方式。有效,它有时返回少于 4 个用户,这正是我试图克服的问题。你知道另一种方法可以返回至少 4 个用户吗?
  • 如果您有至少 4 个用户,它将显示他们。您可以在 phpmyadmin 中测试的查询没有任何问题。您可以注意您的 if 子句,因为如果没有用户 url 则不会显示
  • 罗伯特是对的。您不需要播种 rand() 函数。阅读文档。 dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html 此外,rand() 不是您获得少于 4 个结果的原因。它是 order by 子句,而不是 where 子句。
  • @John 上面的回答在同一行之上;我会试试看是否有效。忘记那个参数感觉很傻。谢谢!
  • 更改了上面的代码以反映没有种子的 rand();我实际上已经阅读了文档并发现了这一点,但是粘贴时还没有删除它;对于那个很抱歉! :)
【解决方案2】:

SQL 查询不是您获得少于 4 个结果的原因...您应该每次都获得 4 个,前提是表中至少有 4 行。

我建议你调试这一行:if (!$username-&gt;user_url) :。您只显示没有 URL 的用户。因此,如果您从 SQL 查询中返回 4 个用户,但其中只有两个缺少 URL,那么您只会获得 2 个用户。

顺便说一句,你不需要为你正在做的事情播种rand() 函数。事实上,它不太可取。只需使用SELECT user_nicename, user_url, user_email FROM $wpdb-&gt;users ORDER BY RAND() LIMIT 4 ");

【讨论】:

  • 刚刚编辑以反映我在粘贴代码时留下的不必要的变量(粘贴后我从源代码中删除了它)。啊!我认为您对 URL 问题的看法可能是正确的;我会看看当他们都有 URL 时会发生什么。忘记那个参数了——谢谢!好收获!
  • 只是出于好奇;您知道可以返回最少结果数量的任何情况吗?尽管我现在知道这与我的问题无关,但我很好奇这是否是可取的/一种好的做法。
  • MySQL 将始终返回您请求的最大行数。如果表中的行数少于 LIMIT ,它只会返回小于 LIMIT ......所以,没有办法设置“最小值......”,如果它需要 MySQL 给你相同的行两次给你的行已经用完了,这是各种问题。
  • 感谢您的帮助!问题解决了。当使用 if/else 语句来确定是否存在用户 URL 时,罪魁祸首是函数版本的剩余部分。通过删除 if 和 end if(以及传递的参数)语句,我能够使查询正常工作。谢谢大家!
  • 有趣;这就说得通了。此外,这个用例听起来可能永远不会存在。再次感谢!
【解决方案3】:

在 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多