0

複雑なタイトルで申し訳ありません。

私はこのスキーマを持っています:

Categories  Albums          Photos 
----------  -------         --------
id          id              id
name        category_id     album_id

これらのテーブルから、次のようなナビゲーション メニューを作成する必要があります。

Category1
   album1
   album2
Category2
   album3
Category3
   album4

これは簡単に作成できますが、ここでは、少なくとも 1 つの写真を含むアルバムと、少なくとも 1 つのアルバムを含むカテゴリのみを表示したいと考えています。どうすればいいですか?

編集:私はCodeigniterを使用していますが、今はこのようにしています:

コントローラーで、2 つの単純なクエリを使用して配列を作成します

 $categories = $this->category->get_categories();

    foreach ($categories as $category)
    {
        $data['categories'][$category->name] = $this->album->get_albums_by_category($category->id);
    }

get_categories() クエリ:

    function get_categories()
{
    $this->db->select('*')->
        from('categories');
    return $this->db->get()->result();
}

そして get_albums のもの:

    function get_albums_by_category($category_id)
{
    // per stampare il nome dell'album nella lingua giusta
    $lang = $this->lang->lang();
    $name = $lang . '_name';
    $this->db->select('id, ' . $name . ' AS name')
        ->from('albums')
        ->group_by('id')
        ->where('category_id', $category_id);
    return $this->db->get()->result();
}

必要に応じて配列になるように、2 つのクエリを使用しました。

4

2 に答える 2

1

基本クエリから始めましょう。

select (case when thetype = 'Category' then category else album end) as what
from ((select 'category' as thetype, category, NULL as album
       from category
      ) union all
      (select 'album', category, album
       from album a join
            category c
            on a.category_id = c.id
      )
     ) t
order by category, album

これで、質問に合わせてこれを変更できます。

select (case when thetype = 'Category' then category else album end) as what
from ((select 'category' as thetype, category, NULL as album
       from categories c
       where c.id in (select category_id from albums)
      ) union all
      (select 'album', category, album
       from albums a join
            categories c
            on a.category_id = c.id
       where a.id in (select album_id from photos)
      )
     ) t
order by category, album
于 2012-07-10T13:43:00.463 に答える
0

次の手法を使用します。

SELECT * 
FROM Albums
WHERE EXISTS (
    SELECT 1
    FROM Photos
    WHERE Photos.album_id = Album.id
)

これは相関サブクエリと呼ばれ、完全な結合に使用すると遅くなる場合がありますが、ここでは EXISTS 句のみを使用すると高速になるはずです。

于 2012-07-10T13:40:20.560 に答える