powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Правильная работа с MySQL
25 сообщений из 97, страница 3 из 4
Правильная работа с MySQL
    #39732184
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TMaestroEvЭто придется каждое поле обернуть функцией, что ухудшит читаемость кода..
Зачем каждое? JOIN (он же INNER JOIN) не даст в результат NULL, кроме того который получен из таблицы.

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

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

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


Ну так полей много, связей тоже много в одном запросе.. в основной таблице хранятся же только коды..
Реальные значения в справочниках все.. придется все поля, которые в Join обернуть функцией.. Ок.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732188
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvНу так полей много, связей тоже много в одном запросе.. в основной таблице хранятся же только коды..
Реальные значения в справочниках все.. придется все поля, которые в Join обернуть функцией.. Ок.Еще раз, для плохо читающих:
DimaTЕсли надо каждое, то проблема совсем в другом месте. База коряво спроектирована. Если тебе не надо чтобы в базе хранились NULL то откуда они там взялись?
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732190
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Повторюсь: если справочник присоединяется с помощью JOIN (он же INNER JOIN) и в справочнике нет NULL, то в результате не будет ни одного NULL.

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


не будет ни одного NULL если A и B не содержат NULL.
Если будут записи где А.b_id = NULL, то такие записи будут проигнорированы и в результат не попадут.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732256
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то мы о разном..
Пример .. представим в основной таблице - некоторые поля могут быть пустыми или ссылки устареть и уже их может не быть в справочниках (пример искусственный для понимания 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 справочника в основной таблице.
Что не так?
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732259
Фотография 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

Используя функции в SELECT получал в результате таблицу с рассчитанными итогами из других таблиц.. и не используя вложенных запросов.
В функциях обращения к другим таблицам и суммирование по товару по этому же счету.

Чем заменить ? Каков синтаксис? Не могу даже в поисковике сформулировать правильно, что я хочу на MySql.. :((
Как это делают на языке далеком от Фокса? :)
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732300
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvЧто-то мы о разном.. Угу, пустота и NULL - две очень большие разницы.Пример .. представим в основной таблице - некоторые поля могут быть пустымиИ опять не надо путать пустоту в полях с NULL или ссылки устареть и уже их может не быть в справочниках (пример искусственный для понимания NULL) .А это уже мусор в данных. Какого лешего он там есть?
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732301
Фотография 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? Читаемости кода не будет..
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732303
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Sizov.
Данные хранятся как надо мне. К ним претензий нет.
В основной базе просто может быть даже не заполнены некоторые ссылки на справочники совсем.
Тогда JOIN вернет NULL . Вот об этом речь.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732306
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или в каждом справочнике надо завести запись с пустым ID?
Так делают?
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732385
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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().
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732393
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvSergey Sizov.
Данные хранятся как надо мне. К ним претензий нет. От вас? Может быть. Но вот со стороны здравого смысла и принципов работы и проектирования баз данных таки есть.В основной базе просто может быть даже не заполнены некоторые ссылки на справочники совсем.
Тогда JOIN вернет NULL . Вот об этом речь.Речь о том, что некоторые плохо понимают зачем и почему в базах данных используется троичная логика и пытаются под это плохо понимание поломать используемый инструмент. В частности, отключить нафиг эту самую троичную логику. Её ведь идиоты придумали. Сами не знали что творили...
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732487
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvВ некоторых полях в результате NULL вместо названий из справочников, потому что не заполнены соответсвующие поля.
И единственный вариант все поля обернуть функцией ISNULL? Читаемости кода не будет..
Читаемости это не повредит. В текущем виде читаемости уже нет.

PS В MySQL не ISNULL(), а I F NULL()
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732490
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvИли в каждом справочнике надо завести запись с пустым ID?
Так делают?
Можно и так поступить. Добавь в каждую таблицу пустую запись с ID=0 и ставь в родительской таблице значением по умолчанию 0.

Я только не понял чем тебя не устроило
Код: sql
1.
SET NULLDISPLAY TO ''
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732919
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvКак это делают на языке далеком от Фокса? :)
MySQL имеет очень неразвитый/примитвный диалект SQL языка.

В T-SQL (MS SQL Server) или PL-SQL (Oracle) можно создавать в запросе временную выборку как и в FoxPro с помощью оператора "WITH".
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39733294
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TMaestroEvИли в каждом справочнике надо завести запись с пустым ID?
Так делают?
Можно и так поступить. Добавь в каждую таблицу пустую запись с ID=0 и ставь в родительской таблице значением по умолчанию 0.

Я только не понял чем тебя не устроило
Код: sql
1.
SET NULLDISPLAY TO ''



Ура!!!! Просто я не знал, что есть такое!!!
Спасибо. Вопрос закрыт.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39733297
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Sizov.
Сергей, русские форумы по программированию отличаются тем, что вместо простого ответа на вопрос - некоторые пытаются учить вас программировать как им хочется. Не тратьте время. Моя программа работает с 2000 года. В ней все так как мне надо. Она вся работает в PRG модулях. Да. До сих пор. На нескольких разнесенных по стране магазинов с репликациями на фоксе - я один программист. Репликации тоже просто отправка-приемка текстовых файлов с данными - для простоты. Даже серверов как таковых нет - это обычные компы. Все исправления делаю легко из-за этого .. хоть с телефона находясь у моря.. и каждый пользователь войдя в программу получает тут же новую версию. Я не тестирую их даже , потому что все модули просты. Их много, но они просты.
Мне на исправления различные уходит минимум времени, потому что основа программы - простота каждого модуля и читаемость.

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

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

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

Оказывается есть вот такая штука. SET NULLDISPLAY TO '' я не знал о ее существовании. Спасибо.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39733301
Фотография 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

Каков синтаксис? В поиске по MySQL - нет похожих примеров - там обычно просто поиск в подзапросе типа есть или нет, а мне надо сумму в подзапросе вернуть или строку - в общем, значение.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39733303
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
Точнее смогу сказать если на вопрос выше ответишь
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39733315
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 - аналогично возвраты.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39733317
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvСергей, русские форумы по программированию отличаются тем, что вместо простого ответа на вопрос - некоторые пытаются учить вас программировать как им хочется. Стандартный набор отмаз олдскула. Вы прямо таки открыли мне глаза! Описали прямо таки уникальный случай, первый в моей практике за 20+ лет.
MaestroEvОказывается есть вот такая штука. SET NULLDISPLAY TO '' я не знал о ее существовании.Похоже, вы не знаете о существовании еще многих вещей. В частности, сия настройка просто не показывает NULL не изменяя само содержимое поля. Вас ждет много граблей в связи с этим. Желаю удачи в деле обоснования нежелания учить и понимать новое для себя.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39733334
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvKOLVYD - суммирует количество выданных товаров по этому счету - их таблицы в накладных
KOLREZ - суммирует количество зарезервированного товара по этому счету - из таблицы резервов
KOLVOZ - аналогично возвраты.
Код: sql
1.
2.
3.
4.
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() можно не писать если товары в счете никогда не повторяются.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39738901
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не получается..
Все чуть сложнее и пляски с синтаксисом не помогли. Прошу помощи.

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
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39738922
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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Откройте для себя алиасы в запросах.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39738925
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну алиасы то у него есть. Название их.... по мне так, не очень )))
Выброс мозга, с пункатми, вряд ли кто то поймет (хотя, телепатов хватает)
Непонятно что хотите. Ясно, что то угодно, только не учиться.

Dima T привел вам рабочий запрос, вы его модернизировали... ну так подумайте немного, почитайте.
Должно быть примерно так.
Код: sql
1.
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.Хочу получить записи позиций в счете. " на технический язык.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39738943
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEv,

Счет один или много? Если один, как в примере выше 21734842 , то
Код: sql
1.
2.
3.
4.
5.
... 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 Читай книжки.
...
Рейтинг: 0 / 0
25 сообщений из 97, страница 3 из 4
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Правильная работа с MySQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]