下面的MySQL查询是这样工作的:在类似treeview的结构中,它正在搜索要使用的模板。
例如:
当子代没有templateId时,它将继承父级的模板。但是当一个孩子有一个templateId时,它会保留他自己的模板。
问题是,下面的查询持续时间约为1秒,是API中经常使用的查询。如何在不丢失工作的情况下优化下面的查询?还是将查询拆分更好?
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(“内容”)字段:
表2(“模板”)字段:
我想做的事情(以及正在工作的内容,但是在这个查询中花费了太多的时间):
发布于 2014-09-30 07:48:13
这里创建了一个非常复杂的SQL命令。这没什么意义。当然,您的问题中缺少了表定义,这于事无补。我们应该猜一下?
我很困惑,你有template.templateName
和template.id
,有时你用一个,然后另一个?当您拥有id
时,始终使用它。它应该是唯一的索引编号,而名称可以是任何东西,甚至不可能是唯一的或索引的。
很明显,你在一个查询中做的太多了。后退一步,用简单的步骤写下你想要做的事情。
应该就这么简单。您可能应该在PHP中这样做,并且只在需要时向数据库询问信息。只剩下一个简单的查询:
SELECT *
FROM content
WHERE siteId = 1 AND langId = 1 AND active = 1 AND pagId = ?
请注意,我只要求我感兴趣的网页。我可能弄错了,但似乎你要求数据库中的所有页面。你可能只需要一个。
https://stackoverflow.com/questions/26114903
复制相似问题