Во-первых, вот мой 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 получают переменные, которые мне нужны в сценарии, даже если внешний запрос ничего не возвращает. Или кто-то может изменить его так, чтобы результат всегда возвращался.
Если что-нибудь еще понадобится, дайте мне знать. :)