|
Правильная работа с MySQL
|
|||
---|---|---|---|
#18+
Dima TMaestroEvЭто придется каждое поле обернуть функцией, что ухудшит читаемость кода.. Зачем каждое? JOIN (он же INNER JOIN) не даст в результат NULL, кроме того который получен из таблицы. Если надо каждое, то проблема совсем в другом месте. База коряво спроектирована. Если тебе не надо чтобы в базе хранились NULL то откуда они там взялись? MaestroEvЕсть решения изящней? Устроила бы глобальная настройка MySQL, при которой NULL вообще заменяется сразу на пустое строковое значение. Именно такой настройки нет, но есть значение по умолчанию для колонки, задай там по умолчанию '' и замени уже существующие NULL на '' Если все спроектировано правильно, то заменять NULL на '' надо только для тех таблиц, которые присоединяются LEFT/RIGHT/FULL JOIN. Ну так полей много, связей тоже много в одном запросе.. в основной таблице хранятся же только коды.. Реальные значения в справочниках все.. придется все поля, которые в Join обернуть функцией.. Ок. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2018, 09:36 |
|
Правильная работа с MySQL
|
|||
---|---|---|---|
#18+
MaestroEvНу так полей много, связей тоже много в одном запросе.. в основной таблице хранятся же только коды.. Реальные значения в справочниках все.. придется все поля, которые в Join обернуть функцией.. Ок.Еще раз, для плохо читающих: DimaTЕсли надо каждое, то проблема совсем в другом месте. База коряво спроектирована. Если тебе не надо чтобы в базе хранились NULL то откуда они там взялись? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2018, 09:43 |
|
Правильная работа с MySQL
|
|||
---|---|---|---|
#18+
Повторюсь: если справочник присоединяется с помощью JOIN (он же INNER JOIN) и в справочнике нет NULL, то в результате не будет ни одного NULL. Т.е. в таком запросе Код: sql 1.
не будет ни одного NULL если A и B не содержат NULL. Если будут записи где А.b_id = NULL, то такие записи будут проигнорированы и в результат не попадут. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2018, 09:45 |
|
Правильная работа с MySQL
|
|||
---|---|---|---|
#18+
Что-то мы о разном.. Пример .. представим в основной таблице - некоторые поля могут быть пустыми или ссылки устареть и уже их может не быть в справочниках (пример искусственный для понимания NULL) . Id,data, iddok, idpsw, idvid, idtowar, idklient, и так далее .. cena, kolvo В справочниках (пишу по русски для простоты) 1. id,названиедокумента 2. id,имяпользователя 3. id,группатоваров 4. id,товар 5. id,klient Теперь когда я LEFT JOIN получу итоговую таблицу для ГРИД - там будет куча Null для тех, для кого не нашелся ID в справочнике или не заполнен ID справочника в основной таблице. Что не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2018, 10:43 |
|
Правильная работа с MySQL
|
|||
---|---|---|---|
#18+
Еще вопрос .. наверное о подзапросах. Я ими в фоксе никогда не пользовался. В фоксе писал так: Select *, KOLVYD(KODDOK,KODTOW) AS KOLVYD,KOLREZ(KODDOK,KODTOW) AS KOLREZ,KOLVOZ(KODDOK,KODTOW) AS KOLVOZ ; where KODDOK=M.KODDOK from PozSce into curs poziciischeta Используя функции в SELECT получал в результате таблицу с рассчитанными итогами из других таблиц.. и не используя вложенных запросов. В функциях обращения к другим таблицам и суммирование по товару по этому же счету. Чем заменить ? Каков синтаксис? Не могу даже в поисковике сформулировать правильно, что я хочу на MySql.. :(( Как это делают на языке далеком от Фокса? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2018, 10:45 |
|
Правильная работа с MySQL
|
|||
---|---|---|---|
#18+
MaestroEvЧто-то мы о разном.. Угу, пустота и NULL - две очень большие разницы.Пример .. представим в основной таблице - некоторые поля могут быть пустымиИ опять не надо путать пустоту в полях с NULL или ссылки устареть и уже их может не быть в справочниках (пример искусственный для понимания NULL) .А это уже мусор в данных. Какого лешего он там есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2018, 11:25 |
|
Правильная работа с MySQL
|
|||
---|---|---|---|
#18+
Вот рабочая вырезка из программы. "SELECT S.*,K.NAIM AS NKLI,P.POLZ AS AVTOR,R.NOMER AS REZERV,PRJ.NOMER AS NPROJ,REM.NOMER AS NREM,BON.SUMMA AS SUMBON,DOG.DATABEGIN AS DOG FROM DOKUMSCH S ; LEFT JOIN DOKUMREZ R ON S.KOD=R.KODSCE ; LEFT JOIN KLIENT K ON S.KODKLI=K.KODKLI " LEFT JOIN BONUSDVI BON ON S.KOD=BON.KODSCE ; LEFT JOIN DOGOVOR DOG ON S.KOD=DOG.SCHET ; LEFT JOIN DOKUMREM REM ON S.KODREM=REM.KOD ; LEFT JOIN PROJS PRJ ON S.KODPROJ=PRJ.KOD " LEFT JOIN PSW P ON S.PSW=P.NOMERPSW "+M_WHERE+" LIMIT 80" В некоторых полях в результате NULL вместо названий из справочников, потому что не заполнены соответсвующие поля. И единственный вариант все поля обернуть функцией ISNULL? Читаемости кода не будет.. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2018, 11:26 |
|
Правильная работа с MySQL
|
|||
---|---|---|---|
#18+
Sergey Sizov. Данные хранятся как надо мне. К ним претензий нет. В основной базе просто может быть даже не заполнены некоторые ссылки на справочники совсем. Тогда JOIN вернет NULL . Вот об этом речь. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2018, 11:28 |
|
Правильная работа с MySQL
|
|||
---|---|---|---|
#18+
Или в каждом справочнике надо завести запись с пустым ID? Так делают? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2018, 11:30 |
|
Правильная работа с MySQL
|
|||
---|---|---|---|
#18+
MaestroEvВот рабочая вырезка из программы. "SELECT S.*,K.NAIM AS NKLI,P.POLZ AS AVTOR,R.NOMER AS REZERV,PRJ.NOMER AS NPROJ,REM.NOMER AS NREM,BON.SUMMA AS SUMBON,DOG.DATABEGIN AS DOG FROM DOKUMSCH S ; LEFT JOIN DOKUMREZ R ON S.KOD=R.KODSCE ; LEFT JOIN KLIENT K ON S.KODKLI=K.KODKLI " LEFT JOIN BONUSDVI BON ON S.KOD=BON.KODSCE ; LEFT JOIN DOGOVOR DOG ON S.KOD=DOG.SCHET ; LEFT JOIN DOKUMREM REM ON S.KODREM=REM.KOD ; LEFT JOIN PROJS PRJ ON S.KODPROJ=PRJ.KOD " LEFT JOIN PSW P ON S.PSW=P.NOMERPSW "+M_WHERE+" LIMIT 80" В некоторых полях в результате NULL вместо названий из справочников, потому что не заполнены соответсвующие поля. И единственный вариант все поля обернуть функцией ISNULL? Читаемости кода не будет..Потрясающе! А мужики то и не знают! Вот уж несколько десятков лет... Можно подумать ваша портянка читаема, хоть и без isnull(). ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2018, 13:15 |
|
Правильная работа с MySQL
|
|||
---|---|---|---|
#18+
MaestroEvSergey Sizov. Данные хранятся как надо мне. К ним претензий нет. От вас? Может быть. Но вот со стороны здравого смысла и принципов работы и проектирования баз данных таки есть.В основной базе просто может быть даже не заполнены некоторые ссылки на справочники совсем. Тогда JOIN вернет NULL . Вот об этом речь.Речь о том, что некоторые плохо понимают зачем и почему в базах данных используется троичная логика и пытаются под это плохо понимание поломать используемый инструмент. В частности, отключить нафиг эту самую троичную логику. Её ведь идиоты придумали. Сами не знали что творили... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2018, 13:20 |
|
Правильная работа с MySQL
|
|||
---|---|---|---|
#18+
MaestroEvВ некоторых полях в результате NULL вместо названий из справочников, потому что не заполнены соответсвующие поля. И единственный вариант все поля обернуть функцией ISNULL? Читаемости кода не будет.. Читаемости это не повредит. В текущем виде читаемости уже нет. PS В MySQL не ISNULL(), а I F NULL() ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2018, 15:28 |
|
Правильная работа с MySQL
|
|||
---|---|---|---|
#18+
MaestroEvИли в каждом справочнике надо завести запись с пустым ID? Так делают? Можно и так поступить. Добавь в каждую таблицу пустую запись с ID=0 и ставь в родительской таблице значением по умолчанию 0. Я только не понял чем тебя не устроило Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2018, 15:31 |
|
Правильная работа с MySQL
|
|||
---|---|---|---|
#18+
MaestroEvКак это делают на языке далеком от Фокса? :) MySQL имеет очень неразвитый/примитвный диалект SQL языка. В T-SQL (MS SQL Server) или PL-SQL (Oracle) можно создавать в запросе временную выборку как и в FoxPro с помощью оператора "WITH". ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2018, 12:07 |
|
Правильная работа с MySQL
|
|||
---|---|---|---|
#18+
Dima TMaestroEvИли в каждом справочнике надо завести запись с пустым ID? Так делают? Можно и так поступить. Добавь в каждую таблицу пустую запись с ID=0 и ставь в родительской таблице значением по умолчанию 0. Я только не понял чем тебя не устроило Код: sql 1.
Ура!!!! Просто я не знал, что есть такое!!! Спасибо. Вопрос закрыт. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2018, 07:51 |
|
Правильная работа с MySQL
|
|||
---|---|---|---|
#18+
Sergey Sizov. Сергей, русские форумы по программированию отличаются тем, что вместо простого ответа на вопрос - некоторые пытаются учить вас программировать как им хочется. Не тратьте время. Моя программа работает с 2000 года. В ней все так как мне надо. Она вся работает в PRG модулях. Да. До сих пор. На нескольких разнесенных по стране магазинов с репликациями на фоксе - я один программист. Репликации тоже просто отправка-приемка текстовых файлов с данными - для простоты. Даже серверов как таковых нет - это обычные компы. Все исправления делаю легко из-за этого .. хоть с телефона находясь у моря.. и каждый пользователь войдя в программу получает тут же новую версию. Я не тестирую их даже , потому что все модули просты. Их много, но они просты. Мне на исправления различные уходит минимум времени, потому что основа программы - простота каждого модуля и читаемость. Пользователю важен результат и скорость. Никого не интересует как это устроено внутри. Все правила программирования хороши для своей задачи. Я не пишу программу управления полетами - это просто торговая программа. В ней все просто. 3000 операций в день не больше. Денормализации в ней ровно столько, чтобы хватило ей работать на обычных компах вместо серверов в отличии от 1С. Чтобы не надо было ее инсталлировать, а можно было просто скопировать и работать. И так все. Оказывается есть вот такая штука. SET NULLDISPLAY TO '' я не знал о ее существовании. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2018, 08:05 |
|
Правильная работа с MySQL
|
|||
---|---|---|---|
#18+
Как заменить использование функции в запросах на подзапрос? Было так Select *, KOLVYD(KODDOK,KODTOW) AS KOLVYD,KOLREZ(KODDOK,KODTOW) AS KOLREZ,KOLVOZ(KODDOK,KODTOW) AS KOLVOZ ; where KODDOK=M.KODDOK from PozSce into curs poziciischeta Каков синтаксис? В поиске по MySQL - нет похожих примеров - там обычно просто поиск в подзапросе типа есть или нет, а мне надо сумму в подзапросе вернуть или строку - в общем, значение. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2018, 08:09 |
|
Правильная работа с MySQL
|
|||
---|---|---|---|
#18+
MaestroEvКак заменить использование функции в запросах на подзапрос? в общем случае никак. Надо смотреть что именно делает функция. MaestroEvБыло так Select *, KOLVYD(KODDOK,KODTOW) AS KOLVYD,KOLREZ(KODDOK,KODTOW) AS KOLREZ,KOLVOZ(KODDOK,KODTOW) AS KOLVOZ ; where KODDOK=M.KODDOK from PozSce into curs poziciischeta Что конкретно делают KOLVYD(), KOLREZ() и т.д. ? MaestroEvВ поиске по MySQL - нет похожих примеров - там обычно просто поиск в подзапросе типа есть или нет, а мне надо сумму в подзапросе вернуть или строку - в общем, значение. Скорее всего надо использовать группировку group by Точнее смогу сказать если на вопрос выше ответишь ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2018, 08:22 |
|
Правильная работа с MySQL
|
|||
---|---|---|---|
#18+
Dima TMaestroEvКак заменить использование функции в запросах на подзапрос? в общем случае никак. Надо смотреть что именно делает функция. MaestroEvБыло так Select *, KOLVYD(KODDOK,KODTOW) AS KOLVYD,KOLREZ(KODDOK,KODTOW) AS KOLREZ,KOLVOZ(KODDOK,KODTOW) AS KOLVOZ ; where KODDOK=M.KODDOK from PozSce into curs poziciischeta Что конкретно делают KOLVYD(), KOLREZ() и т.д. ? MaestroEvВ поиске по MySQL - нет похожих примеров - там обычно просто поиск в подзапросе типа есть или нет, а мне надо сумму в подзапросе вернуть или строку - в общем, значение. Скорее всего надо использовать группировку group by Точнее смогу сказать если на вопрос выше ответишь KOLVYD - суммирует количество выданных товаров по этому счету - их таблицы в накладных KOLREZ - суммирует количество зарезервированного товара по этому счету - из таблицы резервов KOLVOZ - аналогично возвраты. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2018, 09:17 |
|
Правильная работа с MySQL
|
|||
---|---|---|---|
#18+
MaestroEvСергей, русские форумы по программированию отличаются тем, что вместо простого ответа на вопрос - некоторые пытаются учить вас программировать как им хочется. Стандартный набор отмаз олдскула. Вы прямо таки открыли мне глаза! Описали прямо таки уникальный случай, первый в моей практике за 20+ лет. MaestroEvОказывается есть вот такая штука. SET NULLDISPLAY TO '' я не знал о ее существовании.Похоже, вы не знаете о существовании еще многих вещей. В частности, сия настройка просто не показывает NULL не изменяя само содержимое поля. Вас ждет много граблей в связи с этим. Желаю удачи в деле обоснования нежелания учить и понимать новое для себя. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2018, 09:23 |
|
Правильная работа с MySQL
|
|||
---|---|---|---|
#18+
MaestroEvKOLVYD - суммирует количество выданных товаров по этому счету - их таблицы в накладных KOLREZ - суммирует количество зарезервированного товара по этому счету - из таблицы резервов KOLVOZ - аналогично возвраты. Код: sql 1. 2. 3. 4.
по аналогии с выделенным добавь KOLREZ и KOLVOZ group by и sum() можно не писать если товары в счете никогда не повторяются. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2018, 09:58 |
|
Правильная работа с MySQL
|
|||
---|---|---|---|
#18+
Не получается.. Все чуть сложнее и пляски с синтаксисом не помогли. Прошу помощи. 1.Хочу получить записи позиций в счете. 2. У счета бывает несколько накладных (шапки и позиции). Шапка имеет ссылку на счет. В позициях накладной есть товары, такие же как в счете или бывает, что нет. 3. У счета бывают несколько резервов (шапки и позиции). Шапка имеет ссылку на счет. В позициях резерва есть товары, такие же как в счете или бывает, что нет. 4. У счета бывают возвраты (только позиции - все в них, ибо возвращают как правило единично). 5. Название товара хранится в базе номенклатуры. Речь о том что в подселекте надо выбрать все накладные к этому счету , а уже в них товар. Вот так не работает, может потому, что в подселекте нельзя обращаться к таблицам снаружи его? А как тогда? .... LEFT JOIN (SELECT BB.KODTOW,SUM(BB.KOLVO) AS KOLVYD FROM DOKUMNAK AA,NAKLAD BB WHERE AA.KODSCE=SC.KODDOK GROUP BY KODTOW) VYD ON SC.KODTOW = VYD.KODTOW ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2018, 07:55 |
|
Правильная работа с MySQL
|
|||
---|---|---|---|
#18+
MaestroEvНе получается.. И почему-то я совсем не удивлен...Вот так не работает, может потому, что в подселекте нельзя обращаться к таблицам снаружи его?не может. Можно и даже нужно обращаться в подзапросе к данным основного запроса. Вы опять ищете не там,где потеряли, а там, где светлее. А как тогда? .... LEFT JOIN (SELECT BB.KODTOW,SUM(BB.KOLVO) AS KOLVYD FROM DOKUMNAK AA,NAKLAD BB WHERE AA.KODSCE=SC.KODDOK GROUP BY KODTOW) VYD ON SC.KODTOW = VYD.KODTOWОткройте для себя алиасы в запросах. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2018, 09:06 |
|
Правильная работа с MySQL
|
|||
---|---|---|---|
#18+
Ну алиасы то у него есть. Название их.... по мне так, не очень ))) Выброс мозга, с пункатми, вряд ли кто то поймет (хотя, телепатов хватает) Непонятно что хотите. Ясно, что то угодно, только не учиться. Dima T привел вам рабочий запрос, вы его модернизировали... ну так подумайте немного, почитайте. Должно быть примерно так. Код: sql 1.
При чем тут выше написнный вами поток сознания, совершенно не ясно. Вы хоть для себя то, нормальным, техническим языком, напишите ТЗ, уйдя от фраз типа "1.Хочу получить записи позиций в счете. " на технический язык. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2018, 09:21 |
|
Правильная работа с MySQL
|
|||
---|---|---|---|
#18+
MaestroEv, Счет один или много? Если один, как в примере выше 21734842 , то Код: sql 1. 2. 3. 4. 5.
Если много, то давай структуру таблиц, можно только используемые поля (по которым связи и данные, участвующие в расчетах). PS Читай книжки. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2018, 10:00 |
|
|
start [/forum/topic.php?fid=41&msg=39738943&tid=1581664]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
29ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 280ms |
total: | 412ms |
0 / 0 |