用我的SQL查询帮助我(需要它总是返回至少一行.)

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语句检索脚本中需要的变量,即使外部查询没有返回任何内容.或者有人可能会改变它,以便始终返回结果.

如果需要其他任何东西,请告诉我.:)

a1e*_*x07 6

此查询始终返回至少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)


Ali*_*ogy 6

一种不需要列出每个原始列的第二次选择的方法:

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)

如果原始查询返回任何行,它们将不受影响地传递。如果它没有返回任何行,您将得到一行全部为空的行。