Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用COALESCE返回元标题值和导航数组的页面信息_Php_Mysql_Codeigniter 2 - Fatal编程技术网

Php 使用COALESCE返回元标题值和导航数组的页面信息

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

我正在使用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
    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