2015-10-19 3 views
1

Это своего рода трудно заголовок, но, учитывая это утверждение:ВЫБРАТЬ другую строку, если ни одна строка не возвращается

SELECT DISCOUNT FROM people_discounts WHERE ID = ? AND PGROUP = ? 

Предположим, я ввожу ID 5 и PGROUP 2. Эта строка не существует в таблице (fetch возвращает false в случае PHP и mysqli). В этом случае я хочу строку, которая была бы представлена ​​было утверждение было:

SELECT DISCOUNT FROM people_discounts WHERE ID = ? AND PGROUP = 0 

С ID еще будучи 5, но PGROUP «упал обратно» до 0 вместо того, чтобы, что давайте предположим всегда существует.

Возможно ли это с каким-либо IF, CASE или каким-либо другим ключевым словом, о котором я не знаю?

Я знаю, что это, конечно, можно выполнить, запустив второе утверждение в случае без строк, но это не то, что я пытаюсь сделать.

ответ

2

предполагающее запрос должен только когда-либо возвращать одну строку,

select discount from people_discount 
where id = ? and (pgroup = ? or pgroup = 0) 
order by pgroup desc 
limit 1; 
+0

Иисус. Как я мог не думать об этом. Может, пришло время спать. Edit: У меня также был INNER JOIN в моем заголовке. Какие. – nickdnk

1

limit Если кажется, «нечистым» вы можете использовать другие приемы.

Это может быть более компактно, хотя предполагается, что скидка никогда не бывает отрицательная:

select abs(max(case when proup <> 0 then discount else -discount end)) 
from people_discount 
where id = ? and pgroup in (?, 0) 
group by id 

Не каждая платформа имеет верхний предел// выборка вариант. И некоторые люди возражают против запросов, не связанных с множеством. Я просто предлагаю взломы с этими людьми в виду или, по крайней мере, как упражнение, думая о проблемах по-другому.

Идея состоит в том, чтобы предположить, что отрицательная скидка не может быть отрицательной и использовать этот конец шкалы числа, чтобы временно «сохранить» резервную скидку для pgroup 0. MAX() выполняет эквивалент сортировки и ограничения, пользуясь положительным значением когда оба присутствуют. ABS() восстанавливает знак результата.

+0

Я действительно не знаю, что это делает. Предел действительно отвечает на мой вопрос. Тот факт, что он не решает мою проблему, - это совсем другое. Я должен был заснуть, а не спрашивать, хотя кажется, что вопрос кого-то интригует. Редактировать: Я ценю усилия, хотя. Просто я рассматривал возможность удалить его, что сейчас кажется плохим. – nickdnk

+0

Основываясь на информации в вашем вопросе, это вполне действительный ответ. Я не сомневаюсь, что опция «limit» вам более полезна. – shawnt00

+0

Я имел в виду, что рассматривал вопрос об удалении - я уверен, что ваш ответ хорош :) – nickdnk

Смежные вопросы