2011-07-26 37 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);