Joe*_*ski 1 mysql sql optimization resultset query-optimization
首先,这是我的SQL查询:
SELECT research_cost, tech_name,
(SELECT research_cost
FROM technologies
WHERE research_cost <= USERS_RESEARCH_POINTS_VALUE
ORDER BY research_cost DESC
LIMIT 1) as research_prev,
(SELECT cost
FROM technology_costs
WHERE id = 18
LIMIT 1) as technology_cost
FROM `technologies`
JOIN technology_costs
ON id = COUNT_OF_TECHS_USER_LEARNED
WHERE research_cost > USERS_RESEARCH_POINTS_VALUE
ORDER BY research_cost ASC
LIMIT 1
Run Code Online (Sandbox Code Playgroud)
网站链接:http://www.joemajewski.com/fortress/
有些人可能会认为上面的查询是中等大小的,甚至是小的; 不是我.对我来说,这是我写过的最大,最复杂的SQL查询之一,所以我把自己推到了极限.
无论如何,查询本身没有语法错误,并且在大多数情况下它完全符合我的要求.然而,有一个小问题.
如果main SELECT子句没有返回一行("SELECT research_cost,tech_name FROM technologiesWHERE research_cost> whatever"),则整个查询都是空集.
如果有帮助,Fortress就是我正在努力的游戏.这是一个基于浏览器的MMORPG,用户可以在这里建立一支军队,试图在排行榜中占据一席之地.技术是一种游戏机制,用户购买其统计数据(黄金收入,单位生产等)的升级.研究是一种游戏机制,允许您通过培训科学家来进行研究来学习新技术.这就是这个查询的全部内容.它抓住了目前正在研究的技术,以及它的研究成本.它还可以获得下一项技术成本的黄金成本.
所以...有什么方法可以强制在结果集中至少返回一个空行,因为嵌套的select语句检索脚本中需要的变量,即使外部查询没有返回任何内容.或者有人可能会改变它,以便始终返回结果.
如果需要其他任何东西,请告诉我.:)
此查询始终返回至少1行
SELECT * FROM (__your old query__)aaa
UNION
SELECT NULL as research_cost, NULL as tech_name, NULL as research_prev,
... etc [FROM DUAL] // DUAL is a dummy table in mysql
Run Code Online (Sandbox Code Playgroud)
一种不需要列出每个原始列的第二次选择的方法:
SELECT yourstuff.*
FROM (__your original query__) yourstuff
RIGHT OUTER JOIN (SELECT 1 AS fake FROM DUAL) faketable ON 1=1;
Run Code Online (Sandbox Code Playgroud)
如果原始查询返回任何行,它们将不受影响地传递。如果它没有返回任何行,您将得到一行全部为空的行。
| 归档时间: |
|
| 查看次数: |
6438 次 |
| 最近记录: |