我正在创建一个带有codeigniter的多站点CMS,并且在查询导航链接时遇到了问题。每个页面都可以有元值,这些元值可以用特定于站点的元值覆盖默认的(location_id = 0)。我有两个表cms_pages和cms_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)的标题值存在,则我只想要特定位置,否则为通用,否则为空
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次点击,所以速度是有帮助的,但还不是必须的……
我更改了上面的查询,现在它只获取通用数据。任何帮助都是非常感谢的!
发布于 2012-11-28 06:11:35
我认为你应该使用这样的东西:
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-28 06:12:11
我想我找到了一个解决方案
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`这在性能方面是好的吗?
https://stackoverflow.com/questions/13593897
复制相似问题