Ожидалось, что этот запрос не выведет 0 значений, но он

Я ожидал, что этот запрос не выведет 0 значений, но это так. Я думал, что and (...) > 0 не будет выводить 0 значений. Итак, как я могу предотвратить вывод 0 значений?

select lot.*, sum(movement.quantity) as value 
from lot
left join lot_movement as movement on lot.id = movement.lot_id
where lot.item_id = 8 and movement.storage_id = 3
and (select sum(lot_movement.quantity) 
    from lot_movement 
    where lot_movement.lot_id = lot.id
    ) > 0
group by lot.id;

Я пытался добавить and sum(lot_movement.quantity) \> 0, но выдает ошибку invalid use of group function.

много в базе

lot_movements в базе

вывод с 0 значениями

я вижу это

and (select sum(lot_movement.quantity)
    from lot_movement
    where lot_movement.lot_id = lot.id
    group by lot_movement.lot_id) > 0

является избыточным. Это не влияет на результат.

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

P.Salmon 03.04.2022 16:02
stackoverflow.com/help/как спросить
P.Salmon 03.04.2022 16:05

Измените lot.* на lot.id поделиться образцами данных. Это было рассмотрено в предыдущем комментарии, не повторяйте вопрос, который вы ввели в вопросе, задавая вопрос.

Luuk 03.04.2022 16:08

@DaniilShipilov: Но это предотвратит ошибку типа «недопустимое использование групповой функции».

Luuk 03.04.2022 16:24

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

P.Salmon 03.04.2022 16:27

Пожалуйста, используйте текст, а не изображения/ссылки, для текста, включая таблицы и ERD. Перефразируйте или процитируйте другой текст. Дайте только то, что вам нужно, и свяжите это со своей проблемой. Используйте изображения только для того, что не может быть выражено в виде текста или для дополнения текста. Включите легенду / ключ и объяснение с изображением. Пожалуйста, в вопросах кода укажите минимальный воспроизводимый пример. Как спроситьЦентр помощи Уточните, пожалуйста, правками, а не комментариями. PS Пожалуйста: обратная цитата ` не одинарная кавычка '. Посмотрите на отформатированную версию вашего поста перед публикацией. Проверка орфографии. Разумно оформляйте код. Напишите конкретное название.

philipxy 03.04.2022 23:40

Пожалуйста, в вопросах кода дайте минимальный воспроизводимый пример - вырезать и вставить и исполняемый код и пример ввода; желаемый и фактический вывод (включая дословные сообщения об ошибках); теги и версии; четкая спецификация и объяснение. Для SQL включите DDL и табличный код инициализации. Для отладки, которая включает в себя наименьшее количество кода, который вы можете указать, это код, который вы показываете в порядке, расширенный кодом, который вы показываете, не в порядке. Как спроситьЦентр помощи Когда вы получаете результат, которого не ожидаете, приостановите выполнение общей цели, перейдите к 1-му подвыражению с неожиданным результатом и скажите, что вы ожидали и почему, подкрепленное документацией. (Основы отладки.)

philipxy 03.04.2022 23:56

Возможный дубликат Левое соединение с предложением Where

philipxy 04.04.2022 03:23
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
8
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш запрос не дает ожидаемого результата, потому что вы фильтруете по lot.item_id = 8 and movement.storage_id = 3 в предложении where, но не применяете такую ​​же фильтрацию в подзапросе.

Я не совсем уверен, чего вы пытаетесь достичь, но я подозреваю, что добавление предложения having вместо подзапроса решает вашу проблему:

select lot.id, sum(movement.quantity) as value 
from lot
left join lot_movement as movement on lot.id = movement.lot_id
where lot.item_id = 8 and movement.storage_id = 3
group by lot.id
having sum(movement.quantity) > 0

Ваш ответ очень полезен. Это решение проблемы. Большое тебе спасибо

Daniil Shipilov 03.04.2022 16:44

Другие вопросы по теме