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

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

SELECT SC.*,TW.NAIM AS NTOW,TW.CENA_ZAK AS CENA_ZAK,VYD.KOLVYD FROM SCHETA SC ;
LEFT JOIN TOWAR TW ON SC.KODTOW=TW.KODTOW ;
LEFT JOIN (SELECT BB.KODTOW,SUM(BB.KOLVO) AS KOLVYD,AA.KODSCE FROM DOKUMNAK AA,NAKLAD BB GROUP BY BB.KODTOW,AA.KODSCE) VYD ON SC.KODTOW = VYD.KODTOW AND SC.KODDOK=VYD.KODSCE WHERE SC.KODDOK=?M_KODSCE

Что не так? Естественно накладные есть и позиции в них тоже есть. Почему полученный подзапрос не возвращает количество?

Я бы с радостью почитал, о том как писать такие запросы, но даже не могу найти примера подобного.
Ваши примеры мне сильно помогают: с Left Join - уже нет проблем.
27 ноя 18, 10:19    [21745757]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 269
Dima T
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 Читай книжки.


Спасибо. То есть подселект - может быть как обычный селект? Вот такой синтаксис мне понятен, но дает ошибку. Что не так?
Можно же внутри без Join? 18 лет в фоксе без джин обходился :(

... LEFT JOIN (SELECT SUM(BB.KOLVO) AS KOLVYD,BB.KODTOW FROM DOKUMNAK AA,NAKLAD BB GROUP BY KODTOW WHERE AA.KODSCE=?M_KODSCE AND AA.KOD=BB.KODDOK) VYD ON SC.KODTOW = VYD.KODTOW WHERE SC.KODDOK=?M_KODSCE...
27 ноя 18, 10:31    [21745774]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13673
Ты бы код форматировал прежде чем сюда постить
SELECT SC.*,TW.NAIM AS NTOW,TW.CENA_ZAK AS CENA_ZAK,VYD.KOLVYD 
    FROM SCHETA SC
       LEFT JOIN TOWAR TW ON SC.KODTOW=TW.KODTOW ;
       LEFT JOIN (SELECT BB.KODTOW,SUM(BB.KOLVO) AS KOLVYD,AA.KODSCE 
                        FROM DOKUMNAK AA,NAKLAD BB 
                        GROUP BY BB.KODTOW,AA.KODSCE
             ) VYD ON SC.KODTOW = VYD.KODTOW AND SC.KODDOK=VYD.KODSCE 
    WHERE SC.KODDOK=?M_KODSCE

В выделенной строке join надо.
27 ноя 18, 10:34    [21745777]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13673
MaestroEv
Можно же внутри без Join? 18 лет в фоксе без джин обходился :(

Можно, но не нужно. Читать такой запрос неудобно. С join понятно где условие связи таблиц, а где условия отбора. Если все упихать во where то получается каша, особенно если таблиц намного больше двух. Лучше привыкай к join. Фокс join тоже понимает.
27 ноя 18, 10:39    [21745783]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13673
MaestroEv
То есть подселект - может быть как обычный селект? Вот такой синтаксис мне понятен, но дает ошибку. Что не так?

Да, подселект можно запустить без внешнего, если не используются поля внешнего.

SELECT SUM(BB.KOLVO) AS KOLVYD,BB.KODTOW 
          FROM DOKUMNAK AA,NAKLAD BB 
          WHERE AA.KODSCE=?M_KODSCE AND AA.KOD=BB.KODDOK
          GROUP BY KODTOW 

Сначала пишется WHERE а потом GROUP BY.
Фокс такое пропустит, а MySQL ругнется. В остальном вроде правильно.
27 ноя 18, 10:49    [21745792]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 269
Dima T
MaestroEv
Можно же внутри без Join? 18 лет в фоксе без джин обходился :(

Можно, но не нужно. Читать такой запрос неудобно. С join понятно где условие связи таблиц, а где условия отбора. Если все упихать во where то получается каша, особенно если таблиц намного больше двух. Лучше привыкай к join. Фокс join тоже понимает.


Согласен. Так удобнее читать. Теперь уже в MySQL придется все писать как надо.

Дает ошибку. Что не так? Без Where в подзапросе - виснет насмерть.

...LEFT JOIN (SELECT SUM(BB.KOLVO) AS KOLVYD,BB.KODTOW,AA.KODSCE FROM DOKUMNAK AA JOIN NAKLAD BB ON AA.KOD=BB.KODDOK GROUP BY BB.KODTOW,AA.KODSCE WHERE AA.KODSCE=?M_KODSCE) VYD ON SC.KODTOW = VYD.KODTOW AND SC.KODDOK=VYD.KODSCE WHERE SC.KODDOK=?M_KODSCE...
27 ноя 18, 10:52    [21745794]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 269
Dima T
MaestroEv
То есть подселект - может быть как обычный селект? Вот такой синтаксис мне понятен, но дает ошибку. Что не так?

Да, подселект можно запустить без внешнего, если не используются поля внешнего.

SELECT SUM(BB.KOLVO) AS KOLVYD,BB.KODTOW 
          FROM DOKUMNAK AA,NAKLAD BB 
          WHERE AA.KODSCE=?M_KODSCE AND AA.KOD=BB.KODDOK
          GROUP BY KODTOW 

Сначала пишется WHERE а потом GROUP BY.
Фокс такое пропустит, а MySQL ругнется. В остальном вроде правильно.


Огромное спасибо. Значит справлюсь. Отдельно протестирую подселект.
А вообще в подселекте в итоговом селекте использовать поля внешнего можно?
27 ноя 18, 11:20    [21745823]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13673
MaestroEv
А вообще в подселекте в итоговом селекте использовать поля внешнего можно?

Можно, но нежелательно. В этом случае для каждой записи внешнего запроса будет выполнен отдельный подзапрос.
Т.е. подзапрос отработает много раз и в результате получим тормоз.
Хотя возможно оптимизатор найдет более удачный план выполнения запроса и тормозов не будет.
27 ноя 18, 12:44    [21745962]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 269
Спасибо.
Очередной вопрос. Они усложняются. :)

Таблица Naklad ссылается полем kodsce на таблицу Schet в которой есть поле kodkli - ссылка на таблицу Klient.

Мне надо выбрать накладные и в них показать имя клиента, ссылка на которого есть только в счете.
Пример такого синтаксиса покажите, плиз?
7 дек 18, 07:08    [21756565]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
asdor
Member

Откуда: Москва
Сообщений: 447
select k.name
from Naklad  n inner join
Schet s on n.kodsce =s.id inner join
Klient k on s.kodkli = k.id

Прочтите что нибудь на эту тему
7 дек 18, 07:47    [21756581]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 269
С новым годом! Приветствую всех.

Еще один вид селектов используемых мной в Фоксе не могу перевести на язык MySql.
Надо определить если ли заказ этого товара в этот день?
То есть выбрать записи из таблицы-шапки(DOKUMZAP и таблицы-позиции(ZAP) те, у которых в шапке дата нужная, а позициях есть товар нужный.

Делал на Фоксе так:
*********************
PARAMETERS M.SYSDAT,M.KODTOW
********************
SELECT AA.KOD,AA.NOMER,AA.DATA,BB.KOLVO,BB.CENA,BB.KODTOW,AA.DOPOL FROM DOKUMZAP AA,ZAK BB ;
WHERE AA.DATA=M.SYSDAT AND AA.KOD=BB.KODDOK AND BB.KODTOW=M.KODTOW INTO CURS ExistZAP
********************
Понимаю, что надо делать Join, но как бы какую вязать к какой Шапку к позициям или позиции к шапке?
Нет уверенности. Помогите.
10 янв 19, 07:15    [21781194]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13673
Я же это уже писал 21714529

Тут обычный join
SELECT AA.KOD,AA.NOMER,AA.DATA,BB.KOLVO,BB.CENA,BB.KODTOW,AA.DOPOL ;
    FROM DOKUMZAP AA join ZAK BB on AA.KOD=BB.KODDOK;
    WHERE AA.DATA=M.SYSDAT AND BB.KODTOW=M.KODTOW
10 янв 19, 07:20    [21781196]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 269
Спасибо. То есть в JOIN нет особой разницы какую таблицу к какой вязать?
Это я себе лишнего накрутил?
10 янв 19, 07:40    [21781207]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13673
MaestroEv
Спасибо. То есть в JOIN нет особой разницы какую таблицу к какой вязать?

Если речь о том что "AA join BB" или "BB join AA", то без разницы. Оба варианта равнозначны.
10 янв 19, 07:48    [21781208]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 269
Приветствую.
Как получить доп поля заданного размера в SELECT?

Select 00 as SOST,000.00 as PROC ...
в Фоксе - получим поле числовое SOST длиной 2 и числовое поле PROC длиной 6 с дробной частью 2 .

Как это сделать в MySql ?
27 мар 19, 10:00    [21844625]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1427
MaestroEv,
а что, синтаксис MySQL лучше всего знают фоксовики? Может таки в профильном форуме спросить?
27 мар 19, 10:04    [21844634]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13673
CAST(Value as Type)

Select cast(0 as int) as SOST ...


В фоксе тоже работает
27 мар 19, 10:09    [21844642]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

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

C программы надо отправить данные с записи на Фоксе в MySQL
В проге есть уникальные Коды 16тиричные полученные Gen_id() ..
В кодах могут быть любые символы. :(

В фоксе было insert from memvar и Gather и не надо было думать об экранировании.

Теперь надо как-то их засунуть в MySql
Есть модуль - который генерит строку на синтаксисе MySql.

Типа Insert into basa () values () .
Тут нужно указывать значения переменных явно, как то экранируя кавычки и управляющие символы..

Как быть?
17 апр 19, 08:04    [21864388]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13673
Гуглить не пробовал? экранирование кавычек mysql
17 апр 19, 08:09    [21864391]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13673
Ты же уже решил эту проблему полгода назад 21725055.
17 апр 19, 08:13    [21864393]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 269
Dima T
Ты же уже решил эту проблему полгода назад 21725055.


Думал, что решил..

M.str = STRTRAN(M.str, CHR(0), '\x00')
M.str = STRTRAN(M.str, CHR(26), '\x1A')

вот это не работает.. в коды вставляются эти \X00 как есть.
Кавычки отрабатываются верно. Пока убрал эти строки совсем, но сомнения остались.
24 апр 19, 05:43    [21870233]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1427
MaestroEv
Dima T
Ты же уже решил эту проблему полгода назад 21725055.


Думал, что решил..

M.str = STRTRAN(M.str, CHR(0), '\x00')
M.str = STRTRAN(M.str, CHR(26), '\x1A')

вот это не работает.. в коды вставляются эти \X00 как есть.
А с чего бы им работать? Документацию по поводу правильного способа задания значения 16-ричным кодом не пробовали посмотреть? Да хотя бы в командном окне
? '\x00'

не пробовали? Вы откуда такую нотацию взяли? Чем вам Chr(0) и Chr(10) не понравились? Тем более, что во втором аргументе STRTRAN() они вроде как пригодились, а в третьем уже всё, не катят?
А зачем в первой строке CHR(0) меняется на самого же себя? Или для вас CHR(0) и то, что вы пытались закодировать через '\x00', не одно и то же?
24 апр 19, 09:07    [21870306]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 [4]      все
Все форумы / FoxPro, Visual FoxPro Ответить