Помоги мне с моим SQL-запросом (нужно, чтобы он всегда возвращал хотя бы одну строку - PullRequest
1 голос
/ 05 августа 2010

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

Если что-нибудь еще понадобится, дайте мне знать. :)

Ответы [ 4 ]

6 голосов
/ 05 августа 2010

Этот запрос всегда возвращает хотя бы 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
0 голосов
/ 25 марта 2017

Подход, который не требует второго выбора, в котором перечислены все исходные столбцы:

SELECT yourstuff.*
FROM (__your original query__) yourstuff
LEFT OUTER JOIN (SELECT 1 AS fake FROM DUAL) faketable ON 1=1;

Если ваш исходный запрос возвращает какие-либо строки, они пропускаются без изменений.Если он не возвращает строк, вы получите одну строку из всех нулей.

0 голосов
/ 05 августа 2010

Вы можете сначала попытаться получить пустую строку с правильной схемой, а затем попробовать заполнить эти строки запросом, который вы написали выше. Единственным недостатком является дополнительный запрос для этого.

Таким образом, если ваш запрос ничего не возвращает, у вас все еще есть пустая строка, и вы можете проверить это.

0 голосов
/ 05 августа 2010

Я бы попробовал обернуть его в ISNULL ()

Как это:

SELECT research_cost, tech_name, 
ISNULL((SELECT research_cost 
    FROM technologies 
    WHERE research_cost <= USERS_RESEARCH_POINTS_VALUE 
    ORDER BY research_cost DESC 
    LIMIT 1), 0.00) as research_prev, 
    [the rest of your query here]

//Note: instead of '0.00' you'll want some appropriate default value.
...