使用COALESCE返回META标题值以及导航数组的页面信息

时间:2012-11-27 21:59:02

标签: php mysql codeigniter-2

我正在创建一个带有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次点击,因此速度很有帮助但不是必需的......

我更改了上面的查询,所以它现在只抓取通用数据。非常感谢任何帮助!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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`

这是表现良好吗?