【问题标题】:Retrieving a list of blog posts with related tags with less query用较少的查询检索具有相关标签的博客文章列表
【发布时间】:2009-01-30 10:41:01
【问题描述】:

对这两个表进行映像:

Table: Item
Columns: ItemID, Title

Table: Tag
Columns: TagID, ItemID, Title

使用不太可能的查询(即不执行 11 次查询检索 10 个项目)?

【问题讨论】:

    标签: sql query-optimization


    【解决方案1】:

    这是一个简单的外连接。这就是你所追求的吗?

    SELECT
      It.ItemID,
      It.Title [ItemTitle],
      Tg.TagID,
      Tg.Title [TagTitle]
    FROM Item It
    LEFT OUTER JOIN Tag Tg
    ON It.ItemID = Tg.ItemID
    

    【讨论】:

    • 这个查询比 Ben 提出的要好,因为它也检索没有标签的项目。谢谢
    【解决方案2】:

    我不完全确定你在追求什么,但这有帮助吗?

    select Item.ItemID, Item.Title, Tag.TagID, Tag.Title from Item, Tag 
      where Item.ItemID=Tag.ItemID
    

    当您说您不想执行 11 次查询时,您的意思是您不想执行 11 次 SQL 查询,还是您不想收到 10 行的结果?如果是后者,那么我认为这实际上只是意味着您需要以您用来调用 SQL 的任何语言遍历结果。例如,在 PHP 中:

    $query = "select Item.ItemID as i, Item.Title as t1, Tag.TagID as t, Tag.Title as t2 from Item, Tag where Item.ItemID=Tag.ItemID";
    $dataset = mysql_query($query) or die(mysql_error());
    
    $items = Array();
    
    while ($data = mysql_fetch_assoc($dataset))
    {
      $items[$data['i']] = Array($data['t1'], $data['t'], $data['t2']);
    }
    

    【讨论】:

    • 查询不会检索没有标签的项目,但 PHP 逻辑有助于理解如何处理查询结果。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2020-10-21
    相关资源
    最近更新 更多