1

codeigniter を使用してマルチサイト CMS を作成していますが、ナビゲーション リンクのクエリに問題があります。(location_id = 0)各ページには、設定されている場合、サイトに固有の値でデフォルトを上書きするメタ値を含めることができます。2 つのテーブルがcms_pagesありcms_page_meta、情報を格納しています。以下は関連データです

Table cms_pages
    page_id


Table cms_page_meta
    meta_id
    location_id
    page_id
    tag_name
    tag_value

可能であれば、これを 1 回の呼び出しで実行したいと考えています。

これは私が使用していた呼び出しです。タイトル値がすべての場所(location_id = 0)に存在し、特定の場所(location_id = x)が存在する場合は特定の場所が存在する場合、ページが2回リストされます。存在しない場合はジェネリック、そうでない場合はNULL

SELECT cms_page.*, cms_page_meta.tag_value
FROM cms_pages
LEFT JOIN cms_page_meta ON cms_page_meta.page_id = cms_pages.page_id
WHERE cms_page_meta.location_id IN (0, x)
ORDER BY cms_pages.page_order`

合体を使用する必要があると確信していますが、それを実装する方法がわかりません。一度に多くのことをしようとしていますか? 呼び出しを分割して PHP array_merge で処理する必要がありますか? ページまたはメタデータを変更するたびに、呼び出しをキャッシュし、キャッシュを削除/再生成できるため、これを避けたいと思います。サーバーは 1 日に最大 10,000 ヒットを取得するため、速度は役に立ちますが、まだ必要ではありません...

上記のクエリを変更して、現時点では一般的なデータのみを取得するようにしました。どんな助けでも大歓迎です!

4

2 に答える 2

0

次のようなものを使用する必要があると思います。

SELECT
  cms_page.*,
  COALESCE(cms_pm2.meta_id, cms_pm1.meta_id) as meta_id,
  COALESCE(cms_pm2.tag_name, cms_pm1.tag_name) as tag_name,
  COALESCE(cms_pm2.tag_value, cms_pm1.tag_value) as tag_value
FROM
  cms_pages LEFT JOIN cms_page_meta cms_pm1
  ON cms_pm1.page_id = cms_pages.page_id
     AND cms_pm1.location_id = 0
  LEFT JOIN cms_page_meta cms_pm2
  ON cms_pm2.page_id = cms_pages.page_id
     AND cms_pm2.location_id = x      
ORDER BY cms_pages.page_order
于 2012-11-27T22:11:34.787 に答える
0

私は解決策を見つけたと思う

SELECT cms_pages.*, coalesce(s.tag_value, g.tag_value, 'Coming Soon!') as tag_value
from cms_pages
left join cms_page_meta s on ad_pages.page_id = s.page_id and s.tag_name = "title" and s.location_id = 255
left join cms_page_meta g on ad_pages.page_id = g.page_id and g.tag_name = "title" and g.location_id = 0
WHERE `cms_pages`.`page_group_id` =  '5'
AND `page_type` =  1
ORDER BY `cms_pages`.`page_order`

これはパフォーマンス的に良いですか?

于 2012-11-27T22:12:10.983 に答える