选择字段不等于的随机行而另一个字段不在另一个表中

时间:2015-10-28 12:27:29

标签: php mysql

我有两张桌子。在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会非常慢。是否有可能改善我的选择代码呢?

非常感谢:)

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

你应该试试这个 -

$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";

答案 2 :(得分:0)

您需要使用单引号(')将$ 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()的sql语句(或用于连接到mysql服务器的模块中的其他类似函数/方法)中使用它之前正确地转义$ loggedUser的内容。

你也是对的,rand()限制1的顺序严重缩放。我会用3步法取代它:

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

  2. 在php中生成一个0之间的随机数和步骤1中获得的数字。

  3. 通过在包含原始选择标准的查询的limit子句中使用上面的随机数来选择随机记录:select ... where tableB.columnB IS NULL AND username!='$ loggeduser'limit $ randomNumber,1