2015-10-28 97 views
0

我有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"; 

我试图为空后加入和用户名!= $ loggeduser(其中正在保存记录的用户名)但它不起作用。

另外,我已经读了ORDER BY RAND()LIMIT 1会很慢,如果有很多行。是否有可能改善我的选择代码的情况呢?

非常感谢:)

+0

不起作用不是一个错误的确切描述。请向我们提供确切的错误信息或有关意外行为的详细说明。如果username字段是一个varchar,那么你将不得不用单引号括起$ loggeduser。 – Shadow

+0

是的非常感谢你,这完全是错误。我忘了单引号。我应该通过rand()更改订单限制1还是改善它,如果表中有许多行? – Billm

回答

0

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

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

希望,您能正确在SQL语句中使用它与之前逃脱$ loggedUser的内容(或者用于连接到mysql服务器的模块中提供的其他类似功能/方法)。

你也是正确的,兰特()极限1的指令严重缩放。我会用3步的方法替换此:(!tableB.columnB IS NULL和用户名= '$ loggeduser')

  1. 获取的符合条件的记录数使用count()SQL函数。

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

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

+0

对不起,但我很新的编码,所以你的意思是逃避内容? 我正在使用一个包含php文件,它正在检查登录用户并设置cookie。所以通过包含它,我总能得到正确的登录用户,我想。 我该怎么做3步?限制$ randomNumber将是一个数字吗?这是正确的:“Select columnA FROM TableA limit $ randomNumber,1”; – Billm

+0

查看最新回复 – Shadow

+0

谢谢!我做了$ min和$ max,在那里我存储了总数。问题是我无法用PHP获取数字,但我发现要做“Select Count()AS”,现在它完美地工作。谢谢 – Billm

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 
+0

是的,谢谢你,这是:) – Billm

+0

请接受它作为正确的答案然后=]祝你好运! –

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

为什么?你改变了什么?请解释你的答案 – Machavity

相关问题