我有下面的代码可以使用,但我无法弄清楚如何使其从结果中排除具有已登录用户的用户名的行:
$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会非常慢。是否有可能改善我的选择代码呢?
非常感谢:)答案 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步法取代它:
使用count()sql函数获取符合条件的记录数(tableB.columnB IS NULL AND username!='$ loggeduser')。
在php中生成一个0之间的随机数和步骤1中获得的数字。
通过在包含原始选择标准的查询的limit子句中使用上面的随机数来选择随机记录:select ... where tableB.columnB IS NULL AND username!='$ loggeduser'limit $ randomNumber,1