2

我有三张桌子,

Entries, Tags,Entry_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 将其按摩成正确的格式) ?

4

2 回答 2

1

答案是肯定的,至少从 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 都是唯一的(并且您的代码表明是这种情况)。

于 2012-09-08T22:28:30.537 回答
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 (我使用它只是因为我不知道您的列名)。

于 2012-09-08T22:37:36.727 回答