【问题标题】:Selecting a random row where a field is not equal to and another field is not in another table选择一个字段不等于且另一个字段不在另一个表中的随机行
【发布时间】:2026-01-09 19:55:01
【问题描述】:

我有 2 张桌子。在 tableA 中,我将文件名存储在其中一列中。 我还将该文件名存储在 tableB 中。这些文件由登录的用户上传,他们的名称存储在 tableA 中。我真正想做的是从tableA中选择一个随机行,其中文件名不在tableB中,另外从tableA中只选择没有登录用户的用户名的行。

我在下面有这段代码可以工作,但我不知道如何使它从结果中排除具有登录用户用户名的行:

$sql = "SELECT columnA FROM TableA LEFT JOIN tableB on TableA.columnA = tableB.columnB 
WHERE tableB.columnB IS NULL ORDER BY RAND() LIMIT 1";

我尝试在 IS NULL AND username != $loggeduser (保存记录的用户名的位置)之后添加,但它不起作用。

我也读过 ORDER BY RAND() LIMIT 1 如果有很多行会很慢。是否也可以针对这种情况改进我的选择代码?

非常感谢:)

【问题讨论】:

  • 不起作用不是对错误的准确描述。请向我们提供确切的错误消息或意外行为的详细描述。如果用户名字段是 varchar,那么您必须用单引号将 $loggeduser 括起来。
  • 是的,非常感谢您,这正是错误。我忘记了单引号。如果表有很多行,我应该通过 rand() 限制 1 更改顺序还是改进它?

标签: php mysql


【解决方案1】:

$loggedUser需要用单引号(')封装在sql语句中,因为它是一个字符串:

$sql = "SELECT columnA FROM TableA LEFT JOIN tableB on TableA.columnA = tableB.columnB WHERE tableB.columnB IS NULL AND username != '$loggeduser' ORDER BY RAND() LIMIT 1";

希望您在使用mysqli_real_escape_string()(或用于连接到 mysql 服务器的模块中可用的其他类似函数/方法)的 sql 语句中使用 $loggedUser 的内容之前正确转义它的内容。

你也说得对,rand() limit 1 的顺序很糟糕。我会用 3 步方法替换它:

  1. 使用 count() sql 函数获取与您的条件匹配的记录数(tableB.columnB IS NULL AND username != '$loggeduser')。

  2. 在php中生成一个介于0和第一步得到的数字-1之间的随机数。

  3. 在再次包含原始选择条件的查询的限制子句中使用上述随机数选择随机记录:select ... where tableB.columnB IS NULL AND username != '$loggeduser' limit $randomNumber, 1

【讨论】:

  • 对不起,我对编码很陌生,所以你说的转义内容是什么意思?我正在使用一个包含 php 文件来检查登录用户并设置 cookie。所以通过包含它,我总是得到正确的登录用户,我想。我该如何做这 3 步?限制 $randomNumber 将是一个数字,对吗?这是正确的:“Select columnA FROM TableA limit $randomNumber, 1”;
  • 谢谢!我在存储总数的地方做了一个 $min 和 $max 。问题是我无法使用 PHP 获得数字,但我发现要执行“Select Count() AS”,现在它可以完美运行。谢谢
  • 我建议使用 count() sql 函数。我从来没有建议从 php 确定你的人口。
  • 我这样做了:$sql = "SELECT COUNT(columnA) AS total FROM TableA LEFT JOIN tableB on TableA.columnA = tableB.columnB WHERE tableB.columnB IS NULL AND TableA.username = '$loggeduser '";这给了我结果,但这不是您的建议?因为当我在没有 AS 的情况下使用时,我无法获得数字。感谢您的宝贵时间:)
【解决方案2】:
SELECT columnA FROM TableA LEFT JOIN tableB on TableA.columnA = tableB.columnB 
WHERE tableB.columnB IS NULL AND username != loggedUser ORDER BY RAND() LIMIT 1

【讨论】:

  • 请接受它作为正确答案然后 =] 祝你好运!
【解决方案3】:

你应该试试这个 -

$sql = "SELECT columnA FROM TableA LEFT JOIN tableB on TableA.columnA = tableB.columnB 
WHERE tableB.columnB IS NULL AND TableA.username != $loggedUser ORDER BY RAND() LIMIT 1";

【讨论】:

  • 为什么?你改变了什么?请解释你的答案
最近更新 更多