【发布时间】:2011-03-25 22:33:08
【问题描述】:
首先,这是我的 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
网站链接:http://www.joemajewski.com/fortress/
有些人可能认为上面的查询是中等大小,甚至很小;不是我。对我来说,这是我写过的最大、最复杂的 SQL 查询之一,所以我把自己逼到了极限。
无论如何,查询本身没有语法错误,而且大部分情况下它完全符合我的要求。但是,还有一个小问题。
如果SELECT 主子句没有返回一行(“SELECT research_cost, tech_name FROM technologies WHERE research_cost > 不管”),那么整个查询是一个空集。
如果有帮助的话,Fortress 就是我正在开发的这款游戏。这是一款基于浏览器的 MMORPG,用户可以在其中组建一支军队,试图在排行榜中名列前茅。技术是一种游戏机制,用户可以在其中购买升级到他们的统计数据(黄金收入、单位产量等)。研究是一种游戏机制,可让您通过培训科学家进行研究来学习新技术。这就是这个查询的全部内容。它抓住了当前正在研究的技术,以及它的研究成本。它还计算了下一项技术的成本。
所以...有什么方法可以强制在结果集中至少返回一个空行,因为嵌套的 select 语句会检索我在脚本中需要的变量,即使外部查询什么也不返回。或者有人可能会改变它,以便始终返回结果。
如果还需要什么,请告诉我。 :)
【问题讨论】:
-
“默认”行应该返回什么?
-
您是否尝试过 INNER JOIN 而不是 JOIN?只是一个想法......
-
@Benny.. join = 内连接。这是暗示的。
-
我正在尝试了解您要从数据库中检索的内容。看起来你想要用户已经拥有的最昂贵的技术,以及该技术的成本,以及用户没有的最便宜的技术,以及它的成本。这就是你要找的吗?
-
@Joe,如果您开始使用表别名,那就太好了。我想知道技术和技术成本之间的联系以及哪些领域来自哪里。我喜欢下面的 UNION 查询答案,但我打算用 CASE 语句编写一个大型查询。
标签: sql mysql optimization query-optimization resultset