2009-12-14 58 views
1

所以,基本上,我有一個名爲'主題'的MySQL表格,另一個名爲'回覆',例如。在表格「主題」中,有一個名爲「relforum」的字段,它將此主題與論壇部分相關聯。在表格'回覆'中,有一個名爲'reltopic'的字段,它將回復與主題聯繫起來。兩個表都有一個id字段,即auto_increment主鍵。這個查詢可以在沒有循環的情況下完成嗎?

現在,我想選擇某個論壇的所有回覆。由於人的答覆「沒有「relforum」字段,我的辦法是:

  • 選擇帶有「relforum」等於某些論壇和循環通過他們的所有主題
  • 而在循環中,從所有回覆正在處理的主題
  • 將所有fetch_array結果合併到一個多維數組中,然後遍歷它們。

這是這樣的:

$query = mysql_query("SELECT * FROM `topics` WHERE `relforum` = '1'"); 
while($array = mysql_fetch_array($query)) { 
    $temp = mysql_query("SELECT * FROM `replies` WHERE `reltopic` = {$array['id']}"); 
    $results[] = mysql_fetch_array($temp); 
} 

有沒有一種方法來合併所有爲較少的疑問?因爲這個過程基本上會在該論壇的每個主題上運行一個查詢加一個查詢。這將是太多了:P

將relforum字段添加到答覆表是一個解決方案(我仍在設計數據庫部分,所以它不是一個問題添加它),但我想看看是否有一個解。我真的不善於SQL的東西,我只知道基本的SELECT/INSERT/UPDATE,而且我通常使用PHPMyAdmin生成最後兩個,所以...我想我需要一些幫助。

感謝您的閱讀!

+0

我這樣做是同一類型的錯誤,當我許多年前編寫了一個論壇,論壇社區長大了很多,我踢出了多個託管提供商使用太多資源:) – 2009-12-14 21:06:36

回答

2

你基本上需要兩個表的連接。

SELECT * FROM `replies`, `topics` WHERE `replies`.`reltopic` = `topics`.`id` AND `topics`.`relforum` = '1'; 
+0

明白了,謝謝:) – 2009-12-14 20:43:45

+0

這只是要選擇設置了答覆的主題集,儘管這是OP所要求的。只要不發現任何在結果集中沒有回覆的主題,就不會感到困惑。如果你只想回覆數據,你想要:'SELECT reply。* FROM ...' – 2009-12-14 20:56:44

2
SELECT r.* FROM replies r, topics t 
WHERE t.relforum = 1 AND r.reltopic = t.id 

擺脫反引號的。他們是非標準和雜亂的代碼

+0

嗯,我已經習慣了反引號,我記得一個選擇查詢失敗,因爲我用了一個保留字(I考慮)指定要選擇什麼時,所以我開始使用它們:P – 2009-12-14 20:45:45

+0

這是一個弱的理由,並且對反引號的依賴可能會給某些工具帶來麻煩。但是mysql是歪斜的(來自標準)和*不一致的*(在不同的操作系統上有不同的行爲),所以你總是搞砸了...... – 2009-12-14 20:56:50

4

你需要學習使用連接。下面的鏈接是針對SQL服務器的,但mySQl的理論與基本連接基本相同。請不要使用基於逗號的連接,因爲它們已經過時了18年,並且是一個很好的例子。學習使用ANSII標準連接。

http://www.tek-tips.com/faqs.cfm?fid=4785

在訪問數據庫,你幾乎從來不希望使用任何循環。當被要求操作數據集而不是單獨行時,數據庫被設計爲執行得最好。所以你需要停止考慮循環,並開始考慮你需要的一組數據。

+0

+1循環和遊標幾乎總是SQL的錯誤方法。 – 2009-12-14 20:51:47

+0

另一個很好的參考:http://www.codinghorror.com/blog/archives/000976.html – 2009-12-14 20:51:56

+0

謝謝大家,我一定會看看。 – 2009-12-15 07:51:25

2

是的,您應該在這裏使用join。但是,您需要更加小心地處理結果集。

連接是關係數據庫模式中的基本查詢。將它們添加到您的知識阿森納:)

3
SELECT 
     r.* 
FROM 
     replies r 
INNER JOIN 
     topics t 
ON 
     r.reltopic = t.id 
WHERE 
     t.relforum = 1; 
相關問題