2011-07-26 184 views
1

我在SQL上的基礎很薄弱,所以我希望你能忍受我。我有三個表格:內容,類別和分類。由於某些內容屬於一個或多個類別,因此選擇了該設置。SQL查詢優化幫助

我想獲取內容及其相應的類別。

這是當前腳本的過於簡化的版本,而不會出現錯誤檢查程序:

$q = "SELECT * FROM contents WHERE contents.foo = 'bar'" 
$resource = mysql_query($q); 
$categoryFilter = array(); 

$q2 = "SELECT * FROM categorization WHERE "; 
while($content = mysql_fetch_assoc($resource)) 
{ 
    $categoryFilter[] = "content_id='" . $content["id"] . "'"; 
} 

if(count($categoryFilter)) 
{ 
    $q2 .= implode(" OR ", $categoryFilter); 
    mysql_query($q2); 
} 

這是它的要點。我希望你能得到我想要做的。我不知道我是否實際上可以使用JOINS,content_id可能在categorization的多行中出現。所以我所做的只是簡單地附加多個OR's,試圖一個一個地獲取項目。我真的不想在這種情況下使用多個查詢。我希望任何人都可以提出一個方法

感謝您的時間

回答

4

一個查詢應該足以從所有三個表中獲取數據:

SELECT categories.category_id #, other fields 
FROM contents 
INNER JOIN categorization ON contents.content_id = categorization.content_id 
INNER JOIN categories ON categorization.category_id = categories.category_id 
WHERE contents.content_id = 1 # AND other filters 

扭捏的SELECT子句中的列和/或條件WHERE條款根據您的需要。

+0

謝謝回答。我可能不想使用JOINS的原因是一個內容可能屬於5個或更多類別。我從'content'表中返回了很多數據,因爲我真的需要它們。一列實際上是來自富文本(WYSIWYG)編輯器的數據。所以你可以期望該列至少有1kb。我不想讓JOINS重複這些列。我需要的是類別ID。 –

+0

@Ronlando:在這種情況下,我寧願使用兩個查詢:一個從內容表中選擇必要的列;另一個只選擇category_id和category_name(上面的那個)。如果您沒有在select子句中指定* lots_of_data *列,則查詢將不會返回它。 –

0

如果我理解正確的話,你可以在一個SQL語句做到這一點

SELECT * 
FROM contents t1 
JOIN categorization t2 
WHERE t1.content_id = t2.content_id AND t1.foo = 'bar' 

還要確保的content_id既在「內容」和「分類」索引。你可能會覺得值得索引'foo',但這取決於你如何實際搜索。

0

這應該做同樣的事情,在你的榜樣:

$q = " 
    SELECT * 
    FROM 
     contents c 
     categorization ctg ON ctg.content_id = c.id 
    WHERE c.foo = 'bar' 
"; 

$result = mysql_query($q);