我有两个表。在表a中,我将文件名存储在其中一列中。我还将该文件名存储在表B中。这些文件由登录的用户上传,其名称存储在表A中。我实际上想做的是从表a中随机选择一行,其中文件名不在表B中,另外从表a只选择没有登录用户用户名的行。
下面的代码很有效,但我不知道如何从结果中排除具有日志用户用户名的行:
$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!=$loggedouser(其中包含记录的用户名),但它不起作用。
此外,我已经读到,如果有很多行,ORDER BY RAND()LIMIT 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()限制1的顺序缩放不好,这也是对的。我会用三步走的方法来代替它:
使用count()sql函数获取符合条件的记录数(tableB.columnB为NULL AND username!='$loggeduser')。
在php中生成一个介于0和步骤一-1中获得的数字之间的随机数。
再次使用包含原始选择条件的查询的限制子句中的上述随机数选择随机记录:Select。。。其中tableB.columnB为NULL AND username!='$loggeuser限制$randomNumber,1
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
你应该试试这个-
$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";