【问题标题】:Getting sub items using sql?使用 sql 获取子项目?
【发布时间】:2012-09-02 07:53:59
【问题描述】:

我有三张桌子,

EntriesTagsEntry_Tag_Link

我的查询通过并将所有内容从Entries 表中提取出来

SELECT *
FROM (`blog_entries`)
ORDER BY `date` desc

我最终得到了一个条目数组。

然后我循环遍历

foreach($entries as &$entry)
    $entry['tags'] => getTags($entry['id]);

getTags 函数运行此查询

SELECT t.* 
FROM blog_tags t
JOIN blog_entries_tags_link l
    ON t.id = l.tag_id
WHERE l.entry_id = {whatever id was passed}
ORDER BY t.name asc;

所以我最终得到了一个如下所示的数组:

Array
(
    [0] => Array
        (
            [id] => 1
            [title] => First Title
            [tags] => Array
                (
                    [0] => Array
                        (
                            [id] => 1
                            [name] => t1
                        )

                    [1] => Array
                        (
                            [id] => 2
                            [name] => t2
                        )

                )

        )

    [1] => Array
        (
            [id] => 2
            [title] => Second Title
            [tags] => Array
                (
                    [0] => Array
                        (
                            [id] => 1
                            [name] => t1
                        )

                    [1] => Array
                        (
                            [id] => 3
                            [name] => t3
                        )

                )

        )

)

所以,这意味着如果有 200 个条目,我最终会得到 201 个查询, 我想知道是否有一种方法可以在一个查询中获取我需要的所有数据(然后假设使用 php 将其按摩成正确的格式)?

【问题讨论】:

  • 也许可以尝试使用 l.entry_id IN (entry1, entry2....),这样你就不必一个一个地做,但所有这些都在一个查询中。
  • 能否请您发布表格结构以及您的预期输出?

标签: php mysql arrays multidimensional-array


【解决方案1】:

我假设您的博客条目 ID 是 blog_entry_id...

请求:

SELECT b.title, t.entry_id, t.name, l.tag_id 
FROM blog_entries b
JOIN blog_tags t on t.entry_id = b.blog_entry_id
JOIN blog_entries_tags_link l on t.id = l.tag_id
ORDER BY b.date DESC, t.name ASC

PHP:

$result = array();
foreach ($entries as $entry) {

    // Creates a new blog entry on the $result array
    if (!isset($result[ $entry['entry_id'] ])) {
        $blog_entry = array();
        $blog_entry['id'] = $entry['entry_id'];
        $blog_entry['title'] = $entry['title'];
        $blog_entry['tags'] = array();
        $result[ $entry['entry_id'] ] = $entry;
    }

    // Add a new tag
    $tag = array();
    $tag['id'] = $entry['tag_id'];
    $tag['name'] = $entry['name'];
    $result[ $entry['entry_id'] ]['tags'][] = $tag;

}

您可能会注意到您从不使用 blog_entry_tags_link(我使用它只是因为我不知道您的列名)。

【讨论】:

    【解决方案2】:

    答案是肯定的,至少从 SQL 的角度来看是这样。

    SELECT t.* 
    FROM blog_tags t join
         blog_entries_tags_link l
         ON t.id = l.tag_id join
         (SELECT *
          FROM `blog_entries` e
         ) e
         on l.entry_id = e.entry_id
    WHERE l.entry_id = {whatever id was passed}
    ORDER BY e.`date` desc, t.name asc
    

    这是假设每个 blog_entry 的 id 都是唯一的(您的代码表明是这种情况)。

    【讨论】:

    • 所以这个查询应该为数据库中的每个标签链接返回一行是吗?然后我会遍历结果并以我希望的格式创建一个数组?
    • 是的。 . .然后,您可以将其加载到 php.ini 中适当的数据结构中。在单个查询中获取所有结果应该比为每一行运行单独的查询要好得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多