1

我正在使用 codeigniter 创建一个多站点 CMS,并且在查询导航链接时遇到问题。(location_id = 0)每个页面都可以具有元值,如果设置了特定于站点的元值,则这些元值会覆盖默认值。我有两个表cms_pagescms_page_meta存储信息。下面是相关数据

Table cms_pages
    page_id


Table cms_page_meta
    meta_id
    location_id
    page_id
    tag_name
    tag_value

如果可行,我想一次性完成。

这是我正在使用的调用,如果所有位置的标题值都存在,它会导致页面被列出两次,如果存在我只想要(location_id = 0)特定(location_id = x)位置的特定位置,否则它是通用的,否则为 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`

我很确定我应该使用 coalesce 但只是不知道如何实现它。我是否试图一次做太多事情?我应该使用 PHP array_merge 拆分调用和处理吗?我想避免这种情况,因为每当我对页面或元数据进行更改时,我都可以缓存调用并删除/重新生成缓存。服务器每天获得约 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 回答