Всем привет, уже долго не могу решить проблему, нужна помощь. Есть 3 таблицы, запчасти, место на складе, и таблица соотношения запчасти->место таблица локаций простая, id места и его название это таблица с запчастями это таблица соотношений. Суть в том, что на складе общее количество фильтров MANN 6, из этих 6 штук 2 лежат в коробке №2 и 2 лежат в коробке №8. Внимание вопрос: как составить запрос sql который будет показывать на странице только те запчасти, которые не соответствуют ни одной коробке??? Т.е. сейчас мне надо показать те 2 фильтра, которые только что приехали и их необходимо распределить по коробкам.
Часть вопроса я все таки решил PHP: $sql = "SELECT DISTINCT parts.id, parts.manufacturer, parts.vendor, parts.name, parts.count-(SELECT SUM(parts_location.count) FROM `parts_location` WHERE parts_location.parts_id=parts.id) AS count, parts.price, parts.description FROM `parts` LEFT JOIN `parts_location` ON parts.id=parts_location.parts_id "; Но теперь если в таблице запчастей присутствует запись, которой нет в таблице соотношений, то вложенный запрос возвращает NULL и в итоге в count записывается NULL, как быть? PHP: array (size=7) 'id' => string '2' (length=1) 'manufacturer' => string 'SAKURA' (length=6) 'vendor' => string 'C1110' (length=5) 'name' => string 'ФИЛЬТР МАСЛЯНЫЙ' (length=29) 'count' => null 'price' => string '250' (length=3) 'description' => string '' (length=0)
скорее всего вложенный запрос надо поместить в конструкцию IF хотя я лично бы сделал немного по другому и вложенный запрос с группировкой применил во FROM взамест `parts_location` --- Добавлено --- типа получается parts.count-NULL = NULL ?
select field ... и даёт такой результат, что field2 - field = жопа нужно просто либо при выборке select if (field = null, 0, field) либо при операции field2 - if (field = null, 0, field) как вариант отказаться от null, нафик оно в числовом столбике
В таблице нет NULL, там только числа, я так понимаю, это от того, что подзапрос возвращает NULL, т.к. нет записи с parts_id = 2 ну да, подзапрос вернул NULL, а арифметические операции с ним в результате дают NULL. Можно подробнее, про вложенный запрос в FROM?
NULL возвращает результат подзапроса, от него нельзя отказаться)) --- Добавлено --- можно, для начала напишите запрос для `parts_location` с группировкой по parts_id
Так я и не понял, что господа знатоки имеют ввиду, вопрос решен с помощью IFNULL, @Valick спасибо. PHP: $sql = "SELECT DISTINCT parts.id, parts.manufacturer, parts.vendor, parts.name, parts.count-( IFNULL( (SELECT SUM(parts_location.count) FROM `parts_location` WHERE parts_location.parts_id=parts.id), 0) ) AS count, parts.price, parts.description FROM `parts` LEFT JOIN `parts_location` ON parts.id=parts_location.parts_id ";
Так это возвращает лишь дефолтное значение в случае null, так что думаю надо решать вопрос с Код (Text): (SELECT SUM(parts_location.count) FROM `parts_location` WHERE parts_location.parts_id=parts.id)
@keren, неудачная цитата, которую я не могу поправить (религия форума не позволяет) ни коим образом не влияет на мой вам ответ
То есть, не свободное количество оставшееся без коробок (в данном примере 2 = 6 - 2 - 2), а только те, что вообще без коробок? --- Добавлено --- И приложите уж набор тестовых данных и скрипты для создания табличек
А как отличить тех кто без коробок от тех которые вообще без коробок? Зойчем? ТС с минимум подсказок со стороны сообщества справился с задачей, да и в первом сообщении таблицы картинками всё яснопонятно. Так шо он дважды молодец.
Да, вижу, что нужен количественный остаток, а не те, что вообще без коробок Можно ведь использовать группировку... тогда и без вложенного запроса на количество "в коробках" можно обойтись.
@karmay, сравните с вариантом: Код (Text): select p.`name`, p.`count` as cnt, p.count - sum(ifnull(pl.`count`,0)) as remainder from parts p left join parts_location pl on pl.parts_id = p.id group by p.id having remainder > 0; Если нужны нулевые остатки, или, не дай провидение - отрицательные, то можно убрать выражение having. @Valick, а вложенный запрос в данном случае - явное излишество