首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >优化MySQL查询以获得页面的正确模板

优化MySQL查询以获得页面的正确模板
EN

Stack Overflow用户
提问于 2014-09-30 07:17:12
回答 1查看 43关注 0票数 0

下面的MySQL查询是这样工作的:在类似treeview的结构中,它正在搜索要使用的模板。

例如:

  • Home (tpl: home) - (lvl: pagId)
    • Carrousel (tpl: carrousel) - (lvl: subId)
    • Carrousel项目1 (tpl:{从父}继承)- (lvl: sub2Id)

  • 联系人(tpl:联系人)- (lvl: pagId)
    • 地址(tpl:{从父}继承)- (lvl: subId)

  • 论坛(第三方物流:论坛)- (lvl: pagId)
    • 主题(tpl:论坛)- (lvl: subId)
    • 信息(tpl:论坛)- (lvl: subId)

  • 常见问题(tpl: faq) - (lvl: pagId)
    • 问题1(第三方物流:问题)- (lvl: subId)
    • 问题2(第三方物流:问题)- (lvl: subId)
    • 子问题1 (tpl:{从父}继承)- (lvl: sub2Id)
    • 次级问题2(第三方物流:子问题)-(左心室: sub2Id)

当子代没有templateId时,它将继承父级的模板。但是当一个孩子有一个templateId时,它会保留他自己的模板。

问题是,下面的查询持续时间约为1秒,是API中经常使用的查询。如何在不丢失工作的情况下优化下面的查询?还是将查询拆分更好?

代码语言:javascript
运行
复制
SELECT 
                        `c`.*, 
                        `c`.`pagId` AS `parentPagId`,
                        `c`.`subId` AS `parentSubId`,
                        `c`.`sub2Id` AS `parentSub2Id`,
                        `c`.`sub3Id` AS `parentSub3Id`,
                        IF( 
                            `template`.`templateName` IS NOT NULL,
                            `template`.`templateName`,
                            (
                                SELECT 
                                    IF(
                                        `template`.`templateName` IS NOT NULL,
                                        `template`.`templateName`,
                                        'default'
                                    )
                                FROM
                                    `content`
                                LEFT JOIN
                                    `template`
                                ON
                                    `content`.`templateId` = `template`.`id`
                                WHERE
                                    CASE WHEN 
                                        ( `content`.`sub3Id` = '' AND `content`.`sub2Id` != '' AND `content`.`templateId` != 0 AND `content`.`templateId` IS NOT NULL )
                                    THEN 
                                         `content`.`sub2Id` = `c`.`sub2Id`
                                    WHEN 
                                        ( `content`.`sub2Id` = '' AND `content`.`subId` != '' AND `content`.`templateId` != 0 AND `content`.`templateId` IS NOT NULL )
                                    THEN 
                                        `content`.`subId` = `c`.`subId`
                                    WHEN 
                                        ( `content`.`subId` = '' AND `content`.`pagId` != '' AND `content`.`templateId` != 0 AND `content`.`templateId` IS NOT NULL)
                                    THEN 
                                        `content`.`pagId` = `c`.`pagId`
                                    ELSE
                                        ''
                                    END
                                AND
                                    `content`.`siteId` = '1' 
                                AND
                                    `content`.`langId` = '1'
                                AND
                                    `content`.`active` = 1
                                LIMIT 1
                            )
                        ) AS `template`
                    FROM 
                        `content` `c`
                    LEFT JOIN 
                        `template` 
                        ON `c`.`templateId` = `template`.`id`
                    WHERE 
                        `c`.`siteId` = '1' 
                    AND 
                        `c`.`langId` = '1'
                    AND
                        `c`.`active` = 1
                    ORDER BY 
                        `c`.`order`, 
                        `c`.`pagId`, 
                        `c`.`subId`, 
                        `c`.`sub2Id`, 
                        `c`.`sub3Id`

更新

我有两张桌子:

表1(“内容”)字段:

  • pagId
  • subId
  • sub2Id
  • sub3Id
  • 内容
  • templateId

表2(“模板”)字段:

  • id
  • templateName

我想做的事情(以及正在工作的内容,但是在这个查询中花费了太多的时间):

  1. 从数据库获取所有页面

  1. 如果content.templateId > 0:使用template.id = content.templateId从行中获取template.id

  1. 如果content.templateId =0或NULL: get父模板->,那么子查询就是这样做的.

  1. 如果模板未导致有效的templateName: template = "default“
EN

回答 1

Stack Overflow用户

发布于 2014-09-30 07:48:13

这里创建了一个非常复杂的SQL命令。这没什么意义。当然,您的问题中缺少了表定义,这于事无补。我们应该猜一下?

我很困惑,你有template.templateNametemplate.id,有时你用一个,然后另一个?当您拥有id时,始终使用它。它应该是唯一的索引编号,而名称可以是任何东西,甚至不可能是唯一的或索引的。

很明显,你在一个查询中做的太多了。后退一步,用简单的步骤写下你想要做的事情。

  1. 对于每个页面的内容,您似乎都有一个“content”表。如果它引用了一个模板,你就完成了,得到它。
  2. 如果它没有引用模板,请向父模板询问它的模板。

应该就这么简单。您可能应该在PHP中这样做,并且只在需要时向数据库询问信息。只剩下一个简单的查询:

代码语言:javascript
运行
复制
SELECT * 
FROM content 
WHERE siteId = 1 AND langId = 1 AND active = 1 AND pagId = ?

请注意,我只要求我感兴趣的网页。我可能弄错了,但似乎你要求数据库中的所有页面。你可能只需要一个。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26114903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档