2

私は3つのテーブルを持っています、

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のクエリが発生するということです。必要なすべてのデータを、1つのクエリで取得する方法があるのではないかと思います(そして、おそらく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

これは、IDがblog_entryごとに一意であることを前提としています(コードはこれが当てはまることを示唆しています)。

于 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 に答える