Php 使用COALESCE返回元标题值和导航数组的页面信息
我正在使用codeigniter创建一个多站点CMS,在查询导航链接时遇到了问题。每个页面都可以有元值,如果设置了,这些元值可以用特定于站点的元值覆盖默认值Php 使用COALESCE返回元标题值和导航数组的页面信息,php,mysql,codeigniter-2,Php,Mysql,Codeigniter 2,我正在使用codeigniter创建一个多站点CMS,在查询导航链接时遇到了问题。每个页面都可以有元值,如果设置了,这些元值可以用特定于站点的元值覆盖默认值(location\u id=0)。我有两个存储信息的表cms\u page和cms\u page\u meta。以下是相关数据 Table cms_pages page_id Table cms_page_meta meta_id location_id page_id tag_name
(location\u id=0)
。我有两个存储信息的表cms\u page
和cms\u page\u meta
。以下是相关数据
Table cms_pages
page_id
Table cms_page_meta
meta_id
location_id
page_id
tag_name
tag_value
如果可行的话,我想在一次电话中完成这项工作
这是我正在使用的调用,如果所有位置都存在标题值(location\u id=0)
和特定位置(location\u id=x)
,则会导致页面列出两次,其中我只需要特定位置,否则为泛型,否则为空
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数组_merge进行处理吗?我希望避免这种情况,因为每当我更改页面或元数据时,我都可以缓存调用并删除/重新生成缓存。服务器每天获得约10000次点击,因此速度是有帮助的,但还没有必要
我更改了上面的查询,因此它现在只获取通用数据。非常感谢您的帮助 我认为您应该使用以下内容:
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
我想我找到了解决办法
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`
这个性能好吗?很酷,与我最终发现的类似。我认为在
meta\u id
和tag\u name
上使用coalesce是没有必要的(主要是因为我没有使用这些值:),但可能对其他人有好处。此查询用于填充导航数组,我希望获得所有页面的元数据中设置的页面标题。谢谢你的帮助。@vortextrangent不客气!是的,它几乎和你的一样。。。应该可以:)是的,您可以在COALESCE中添加第三个默认值,以防两个值都为null