Справка MySQL: как найти все заказы от клиента до суммы (цены) <= 150 и статуса = 'неоплаченный'

#mysql

#mysql

Вопрос:

Пример:

 select orderid
from `orders`
where sum(price) <= 150 and status=unpaid and ownerid=110786
 

но это не сработало.

Подробно: я хочу найти все заказы от клиента (ownerid), где статус НЕОПЛАЧЕН до (цена) 150.

Это необходимо, потому что я хочу позволить клиентам оплачивать столько заказов, сколько они могут, из доступных средств.


Для ОТВЕТА № 1 может работать так, как ожидалось, но в коде есть какая-то ошибка, поскольку он не генерирует требуемый результат, и когда я также добавил итоговые значения, чтобы увидеть, работает ли значение, все строки показывают их двойную цену в этом поле вместо last-column-price current-column-priceзначения. Я не уверен, что мои данные имеют смысл, но я просто пытаюсь проиллюстрировать, что mysql возвращает в результате 🙂

Для ОТВЕТА № 2 вы написали status вместо paymentstatus, поэтому результат был пустым, но когда я исправил это и запустил следующий запрос:

выберите orderid, price, designname из заказов, где paymentstatus=’неоплаченный’ и ownerid= 110786 группируются по orderid с суммой (ценой) <= 50

 RESULT SHOWN IS: 

orderid price   designname 
114279  15  Premier Academy    
114280  10  Troop              
114386  15  Texas Tennis 
114408  20  Nokia Developer   
114508  15  Gold  Lighthouse 
 

КАК ВЫ МОЖЕТЕ ВИДЕТЬ, ОБЩАЯ ЦЕНА СОСТАВЛЯЕТ НЕ МЕНЕЕ 50 долларов, а 75 долларов. ПОЖАЛУЙСТА, ПОМОГИТЕ… Спасибо!

Также обратите внимание, что stackoverflow — замечательный сервис, но форматирование комментариев — действительно сложная работа. Пожалуйста, сделайте это как-нибудь проще. Я слишком много раз пытался форматировать комментарии таким образом, чтобы их можно было легко прочитать, но все усилия не увенчались успехом, поэтому теперь я пишу комментарии в разделе «Ответы на мои вопросы»

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

Пожалуйста, ребята, помогите мне как-нибудь. То, что я пытаюсь сделать, — это то, что так или иначе делают все тележки. Если у клиента есть 10 заказов на 10 долларов США, каждый на общую сумму 100 долларов, но у него всего 50,00 долларов. Как он может проверить, сколько заказов может быть оплачено этой суммой? Это все, что мне нужно найти / закодировать.

Комментарии:

1. вам могут понадобиться кавычки, если «неоплаченный» — это строка

2. что это вам дает? ошибка? неправильный набор данных?

Ответ №1:

Я думаю, вы можете выполнить это с помощью переменных MySQL… используйте один в качестве текущего итога и примените предложение HAVING, чтобы отрезать его…

 select
      o.orderid,
      o.price,
      @RunningTotal := @RunningTotal   o.price as TotalSoFar
   from
      orders o,
      ( select @RunningTotal := 0 ) sqlvars
   where
          o.ownerid = 110786
      and o.status = unpaid
   having 
      TotalSoFar <= 150
 

Переменная @runningTotal просто продолжает добавляться «на лету» и застревает в последнем столбце результата запроса, но остается просто переменной для следующей записи, которая определяет предложение WHERE . Итак, даже если у вас есть заказы, общая сумма которых достигает 200, 300 или чего угодно, предложение final HAVING отсечет их, используя столбец «TotalSoFar» в качестве основы для удаления всех остальных строк…

Комментарии:

1. Два приведенных выше ответа работают не так, как требуется: ( ПОЖАЛУЙСТА, ПОМОГИТЕ.

2. @HaiderAbbas, как не работает … сбой в SQL? неправильный результат? Можете ли вы показать некоторые примеры данных о том, что у вас есть, в сравнении с тем, что получается в результате? Не работать — это все равно, что сказать, что мне нужен камень, и не описать, какой камень мне нужен.

Ответ №2:

неясно, получаете ли вы сообщение об ошибке, но попробуйте это:

 select orderid
from `orders`
where status=unpaid and ownerid=110786
group by orderid
having sum(price) <= 150
 

Комментарии:

1. БОЛЬШОЕ СПАСИБО ЗА ПОПЫТКУ ПОМОЧЬ, но он не выдает никаких ошибок и ничего не показывает. Просто пустое поле orderid. Пожалуйста, сообщите.

2. что вы получаете, когда пытаетесь «выбрать * из заказов, где ownerid = 110786 и status = неоплаченный»?

3. вы написали status вместо paymentstatus, поэтому результат был пустым, но когда я исправил это, я запустил: выберите orderid, price, designname orders , откуда paymentstatus=’неоплаченный’ и ownerid= 110786 группируйте по orderid с sum (price) <= 50 ПОКАЗАННЫЙ РЕЗУЛЬТАТ: orderid price designname 114279 15 Premier Academy 114280 10Отряд 32 114386 15 Техасский теннис 114408 0 Клуб шнауцеров 114409 0 Клуб Шнауцеров_2 114434 20 Разработчик Nokia 114508 15 Золотой маяк КАК ВЫ МОЖЕТЕ ВИДЕТЬ, ОБЩАЯ ЦЕНА СОСТАВЛЯЕТ НЕ МЕНЕЕ 50 долларов, а 75 долларов. ПОЖАЛУЙСТА, ПОМОГИТЕ… Спасибо!

4. <pre> вы написали status вместо paymentstatus, поэтому результат был пустым, но когда я исправил это, я запустил: выберите orderid, price, designname orders , откуда paymentstatus=’неоплаченный’ и ownerid= 110786 группируйте по orderid с суммой (price) <= 50 ПОКАЗАННЫЙ РЕЗУЛЬТАТ: orderid price designname 114279 15 PremierАкадемия 114280 10 Отряд 32 114386 15 Техасский теннис 114408 0 Клуб Шнауцеров 114409 0 Клуб Шнауцеров_2 114434 20 Разработчик Nokia 114508 15 Золотой маяк КАК ВЫ МОЖЕТЕ ВИДЕТЬ, ОБЩАЯ ЦЕНА СОСТАВЛЯЕТ НЕ МЕНЕЕ 50 долларов, а 75 долларов. ПОЖАЛУЙСТА, ПОМОГИТЕ… Спасибо! </ pre>

5. пожалуйста, обновите свой исходный пост — это трудно прочитать в комментариях