【问题标题】:SQL Query Optimization helpSQL 查询优化帮助
【发布时间】:2011-07-26 09:25:14
【问题描述】:

我的 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,试图一个接一个地获取项目。我真的不想在这种情况下使用多个查询。我希望任何人都可以提出一种方法

感谢您的宝贵时间

【问题讨论】:

    标签: php mysql sql join


    【解决方案1】:

    一个查询应该足以从所有三个表中获取数据:

    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 子句中的条件。

    【讨论】:

    • 感谢您的回答。我可能不想使用 JOINS 的原因是一个内容可能属于 5 个或更多类别。我从content 表中返回了很多数据,因为我真的需要它们。一列实际上是来自富文本 (WYSIWYG) 编辑器的数据。因此,您可以期望该列至少有 1kb。我不希望 JOINS 复制这些列。我只需要类别 ID。
    • @Ronlando:在这种情况下,我宁愿使用两个查询:一个从内容表中选择必要的列;另一个只选择 category_id 和 category_name(上面的那个)。如果未在 select 子句中指定 lots_of_data 列,则查询不会返回它。
    【解决方案2】:

    这应该和你的例子一样:

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

    【讨论】:

      【解决方案3】:

      如果我理解正确的话,你可以在一个 sql 语句中做到这一点

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

      还要确保 content_id 在“内容”和“分类”中都被编入索引。您可能会发现索引 'foo' 也是值得的,但这取决于您实际搜索的方式。

      【讨论】:

        猜你喜欢
        • 2014-02-06
        • 2011-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-06
        相关资源
        最近更新 更多