Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 269
Dima T
MaestroEv
Это придется каждое поле обернуть функцией, что ухудшит читаемость кода..

Зачем каждое? JOIN (он же INNER JOIN) не даст в результат NULL, кроме того который получен из таблицы.

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

MaestroEv
Есть решения изящней? Устроила бы глобальная настройка MySQL, при которой NULL вообще заменяется сразу на пустое строковое значение.

Именно такой настройки нет, но есть значение по умолчанию для колонки, задай там по умолчанию '' и замени уже существующие NULL на ''

Если все спроектировано правильно, то заменять NULL на '' надо только для тех таблиц, которые присоединяются LEFT/RIGHT/FULL JOIN.



Ну так полей много, связей тоже много в одном запросе.. в основной таблице хранятся же только коды..
Реальные значения в справочниках все.. придется все поля, которые в Join обернуть функцией.. Ок.
13 ноя 18, 09:36    [21732596]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1448
MaestroEv
Ну так полей много, связей тоже много в одном запросе.. в основной таблице хранятся же только коды..
Реальные значения в справочниках все.. придется все поля, которые в Join обернуть функцией.. Ок.
Еще раз, для плохо читающих:
DimaT
Если надо каждое, то проблема совсем в другом месте. База коряво спроектирована. Если тебе не надо чтобы в базе хранились NULL то откуда они там взялись?
13 ноя 18, 09:43    [21732603]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 14096
Повторюсь: если справочник присоединяется с помощью JOIN (он же INNER JOIN) и в справочнике нет NULL, то в результате не будет ни одного NULL.

Т.е. в таком запросе
select * from A join B on A.b_id = B.b_id

не будет ни одного NULL если A и B не содержат NULL.
Если будут записи где А.b_id = NULL, то такие записи будут проигнорированы и в результат не попадут.
13 ноя 18, 09:45    [21732605]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 269
Что-то мы о разном..
Пример .. представим в основной таблице - некоторые поля могут быть пустыми или ссылки устареть и уже их может не быть в справочниках (пример искусственный для понимания 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 ноя 18, 10:43    [21732695]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 269
Еще вопрос .. наверное о подзапросах. Я ими в фоксе никогда не пользовался.

В фоксе писал так:
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 ноя 18, 10:45    [21732700]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1448
MaestroEv
Что-то мы о разном..
Угу, пустота и NULL - две очень большие разницы.
Пример .. представим в основной таблице - некоторые поля могут быть пустыми
И опять не надо путать пустоту в полях с NULL
или ссылки устареть и уже их может не быть в справочниках (пример искусственный для понимания NULL) .
А это уже мусор в данных. Какого лешего он там есть?
13 ноя 18, 11:25    [21732762]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 269
Вот рабочая вырезка из программы.
"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 ноя 18, 11:26    [21732764]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 269
Sergey Sizov.
Данные хранятся как надо мне. К ним претензий нет.
В основной базе просто может быть даже не заполнены некоторые ссылки на справочники совсем.
Тогда JOIN вернет NULL . Вот об этом речь.
13 ноя 18, 11:28    [21732766]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 269
Или в каждом справочнике надо завести запись с пустым ID?
Так делают?
13 ноя 18, 11:30    [21732769]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1448
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 ноя 18, 13:15    [21732925]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1448
MaestroEv
Sergey Sizov.
Данные хранятся как надо мне. К ним претензий нет.
От вас? Может быть. Но вот со стороны здравого смысла и принципов работы и проектирования баз данных таки есть.
В основной базе просто может быть даже не заполнены некоторые ссылки на справочники совсем.
Тогда JOIN вернет NULL . Вот об этом речь.
Речь о том, что некоторые плохо понимают зачем и почему в базах данных используется троичная логика и пытаются под это плохо понимание поломать используемый инструмент. В частности, отключить нафиг эту самую троичную логику. Её ведь идиоты придумали. Сами не знали что творили...
13 ноя 18, 13:20    [21732935]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 14096
MaestroEv
В некоторых полях в результате NULL вместо названий из справочников, потому что не заполнены соответсвующие поля.
И единственный вариант все поля обернуть функцией ISNULL? Читаемости кода не будет..

Читаемости это не повредит. В текущем виде читаемости уже нет.

PS В MySQL не ISNULL(), а IFNULL()
13 ноя 18, 15:28    [21733130]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 14096
MaestroEv
Или в каждом справочнике надо завести запись с пустым ID?
Так делают?

Можно и так поступить. Добавь в каждую таблицу пустую запись с ID=0 и ставь в родительской таблице значением по умолчанию 0.

Я только не понял чем тебя не устроило
SET NULLDISPLAY TO ''
13 ноя 18, 15:31    [21733138]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Sergey Ch
Member

Откуда: Благовещенск
Сообщений: 8794
MaestroEv
Как это делают на языке далеком от Фокса? :)

MySQL имеет очень неразвитый/примитвный диалект SQL языка.

В T-SQL (MS SQL Server) или PL-SQL (Oracle) можно создавать в запросе временную выборку как и в FoxPro с помощью оператора "WITH".
14 ноя 18, 12:07    [21734004]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 269
Dima T
MaestroEv
Или в каждом справочнике надо завести запись с пустым ID?
Так делают?

Можно и так поступить. Добавь в каждую таблицу пустую запись с ID=0 и ставь в родительской таблице значением по умолчанию 0.

Я только не понял чем тебя не устроило
SET NULLDISPLAY TO ''


Ура!!!! Просто я не знал, что есть такое!!!
Спасибо. Вопрос закрыт.
15 ноя 18, 07:51    [21734778]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 269
Sergey Sizov.
Сергей, русские форумы по программированию отличаются тем, что вместо простого ответа на вопрос - некоторые пытаются учить вас программировать как им хочется. Не тратьте время. Моя программа работает с 2000 года. В ней все так как мне надо. Она вся работает в PRG модулях. Да. До сих пор. На нескольких разнесенных по стране магазинов с репликациями на фоксе - я один программист. Репликации тоже просто отправка-приемка текстовых файлов с данными - для простоты. Даже серверов как таковых нет - это обычные компы. Все исправления делаю легко из-за этого .. хоть с телефона находясь у моря.. и каждый пользователь войдя в программу получает тут же новую версию. Я не тестирую их даже , потому что все модули просты. Их много, но они просты.
Мне на исправления различные уходит минимум времени, потому что основа программы - простота каждого модуля и читаемость.

Пользователю важен результат и скорость.

Никого не интересует как это устроено внутри. Все правила программирования хороши для своей задачи.
Я не пишу программу управления полетами - это просто торговая программа. В ней все просто. 3000 операций в день не больше.

Денормализации в ней ровно столько, чтобы хватило ей работать на обычных компах вместо серверов в отличии от 1С.
Чтобы не надо было ее инсталлировать, а можно было просто скопировать и работать. И так все.

Оказывается есть вот такая штука. SET NULLDISPLAY TO '' я не знал о ее существовании. Спасибо.
15 ноя 18, 08:05    [21734782]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 269
Как заменить использование функции в запросах на подзапрос?

Было так
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 ноя 18, 08:09    [21734787]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 14096
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 ноя 18, 08:22    [21734789]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 269
Dima T
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
Точнее смогу сказать если на вопрос выше ответишь


KOLVYD - суммирует количество выданных товаров по этому счету - их таблицы в накладных
KOLREZ - суммирует количество зарезервированного товара по этому счету - из таблицы резервов
KOLVOZ - аналогично возвраты.
15 ноя 18, 09:17    [21734809]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1448
MaestroEv
Сергей, русские форумы по программированию отличаются тем, что вместо простого ответа на вопрос - некоторые пытаются учить вас программировать как им хочется.
Стандартный набор отмаз олдскула. Вы прямо таки открыли мне глаза! Описали прямо таки уникальный случай, первый в моей практике за 20+ лет.
MaestroEv
Оказывается есть вот такая штука. SET NULLDISPLAY TO '' я не знал о ее существовании.
Похоже, вы не знаете о существовании еще многих вещей. В частности, сия настройка просто не показывает NULL не изменяя само содержимое поля. Вас ждет много граблей в связи с этим. Желаю удачи в деле обоснования нежелания учить и понимать новое для себя.
15 ноя 18, 09:23    [21734812]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 14096
MaestroEv
KOLVYD - суммирует количество выданных товаров по этому счету - их таблицы в накладных
KOLREZ - суммирует количество зарезервированного товара по этому счету - из таблицы резервов
KOLVOZ - аналогично возвраты.

Select *, VYD.KOLVYD;
   from PozSce left join (select KODTOW, sum(kolvo) as KOLVYD from ... where KODDOK=M.KODDOK group by KODTOW) VYD on PozSce.KODTOW = VYD.KODTOW;
   where KODDOK=M.KODDOK;
   into curs poziciischeta 

по аналогии с выделенным добавь KOLREZ и KOLVOZ

group by и sum() можно не писать если товары в счете никогда не повторяются.
15 ноя 18, 09:58    [21734842]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 269
Не получается..
Все чуть сложнее и пляски с синтаксисом не помогли. Прошу помощи.

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 ноя 18, 07:55    [21745658]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1448
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 ноя 18, 09:06    [21745695]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
asdor
Member

Откуда: Москва
Сообщений: 455
Ну алиасы то у него есть. Название их.... по мне так, не очень )))
Выброс мозга, с пункатми, вряд ли кто то поймет (хотя, телепатов хватает)
Непонятно что хотите. Ясно, что то угодно, только не учиться.

Dima T привел вам рабочий запрос, вы его модернизировали... ну так подумайте немного, почитайте.
Должно быть примерно так.
LEFT JOIN (SELECT BB.KODTOW,SUM(BB.KOLVO) AS KOLVYD,AA.KODSCE FROM DOKUMNAK AA,NAKLAD BB GROUP BY KODTOW,AA.KODSCE) VYD ON SC.KODTOW = VYD.KODTOW and SC.KODDOK=VYD.KODSCE

При чем тут выше написнный вами поток сознания, совершенно не ясно.
Вы хоть для себя то, нормальным, техническим языком, напишите ТЗ, уйдя от фраз типа "1.Хочу получить записи позиций в счете. " на технический язык.
27 ноя 18, 09:21    [21745703]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 14096
MaestroEv,

Счет один или много? Если один, как в примере выше 21734842, то
... LEFT JOIN (
      SELECT BB.KODTOW, SUM(BB.KOLVO) AS KOLVYD 
                 FROM DOKUMNAK AA join NAKLAD BB on AA.??? = BB.??? WHERE AA.KODSCE=M.KODDOK 
                 GROUP BY KODTOW
         ) ...


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

PS Читай книжки.
27 ноя 18, 10:00    [21745736]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
Все форумы / FoxPro, Visual FoxPro Ответить