2015-10-28 96 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

相關問題