powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / INSERT + SELECT + пользовательские значения
15 сообщений из 15, страница 1 из 1
INSERT + SELECT + пользовательские значения
    #38692874
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите пожалуйста по запросу, вопроса 2:
1. Как дополнительно вставить значения, кроме значений из выборки ? Т.е. мне нужно кроме перечисленных в начале полей вставить еще одно, с датой (не текущей!). Гугление что-то не дает ответа :(
2. Как в целом реализован запрос, есть ли к чем придраться ?
Заранее благодарю!


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
INSERT INTO `realiz`
	(`workmonth`, `smrursumm`, `nkoborsumm`, `worksumm`, `division1`, `idsm`, `smnum`, `smarndsumm`, `smarndmonth`, `smarnditogo`, `clname`, `objid`, `objnum`, `objaddress`, `idmontazh`, `debt`)  
SELECT 
    `nktb`.`crdate` AS `nkmonth`,
    `smetytb`.`rursum` AS `smsumm`,
    `nktb`.`nksummout` AS `nksumm`,
    (`smetytb`.`rursum` - `nktb`.`nksummout`) AS `worksumm`,
    `p_orders`.`itogo` AS `paysumm`,
    `smetytb`.`id` AS `smid`,
    `smetytb`.`smnum` AS `smnum`,
    IF(`smetytb`.`arnd` = '0', NULL, `smetytb`.`arndcost`) AS `smarndcost`,
    IF(`smetytb`.`arnd` = '0', NULL, `smetytb`.`arndmnth`) AS `smarndmnth`,
    IF(`smetytb`.`arnd` = '0', NULL, `smetytb`.`arnditsum`) AS `smarndsumm`,
    `clients`.`clname` AS `clname`,
    `objects`.`id` AS `objid`,
    (`objects`.`objnum` + '\\' + `objects`.`id`) AS `objnum`,
    IF(`objects`.`objapartaments` IS NULL, 
       `city`.`city` + ', ' + `street`.`street` + ' ' + `objects`.`objhouse` + '-' + `objects`.`objapartaments`, 
       `city`.`city` + ', ' + `street`.`street` + ' ' + `objects`.`objhouse`) AS `objaddress`,
    `objects`.`objmontazh` AS `montazhid`,
    (`smetytb`.`rursum` - IF(`p_orders`.`itogo` IS NULL, 0, `p_orders`.`itogo`)) AS `debt`
FROM `nktb`
LEFT JOIN `objects` ON `objects`.`id` = `nktb`.`nkobjid`
LEFT JOIN `clients` ON `clients`.`id` = `objects`.`objidcl`
LEFT JOIN `city` ON `city`.`id` = `objects`.`objcity`
LEFT JOIN `street` ON `street`.`id` = `objects`.`objstreet`
LEFT JOIN `smetytb` ON `smetytb`.`id` = `nktb`.`nkidsm`
LEFT JOIN `p_orders` ON `p_orders`.`idsm` = `nktb`.`nkidsm`
				AND DATE_FORMAT(`p_orders`.`cr_date`,'%c') = '6' 
                                AND DATE_FORMAT(`p_orders`.`cr_date`,'%Y') = '2014'
                                AND (`p_orders`.`podtype` = '7'
                                  OR `p_orders`.`podtype` = '9'
                                  OR `p_orders`.`podtype` = '11'
                                  OR `p_orders`.`podtype` = '14'
                                  OR `p_orders`.`podtype` = '18'
                                  OR `p_orders`.`podtype` = '19'
                                  OR `p_orders`.`podtype` = '25')
WHERE `nktb`.`nksummin` IS NULL
  AND DATE_FORMAT(`nktb`.`crdate`,'%c') = '6' 
  AND DATE_FORMAT(`nktb`.`crdate`,'%Y') = '2014'
  AND (`nktb`.`nkindgr` = '9'
   OR `nktb`.`nkindgr` = '47'
   OR `nktb`.`nkindgr` = '68')


...
Рейтинг: 0 / 0
INSERT + SELECT + пользовательские значения
    #38692933
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korshunТ.е. мне нужно кроме перечисленных в начале полей вставить еще одно, с датой (не текущей!)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
INSERT INTO 
<...>
SELECT 
    `nktb`.`crdate` AS `nkmonth`,
   <...>,
    (`smetytb`.`rursum` - IF(`p_orders`.`itogo` IS NULL, 0, `p_orders`.`itogo`)) AS `debt`,
   '2014-07-10' as ещё_одно_поле
FROM `nktb`
<...>


korshun2. Как в целом реализован запрос, есть ли к чем придраться ?Телепаты в отпуске, а мы не в курсе, что этот запрос должен выбирать, откуда и в какие сроки. Ну разве что вместо date_format можно использовать year() и month() - впрочем, на производительности это не скажется -, да вместо кучи OR-ов написать "`p_orders`.`podtype` IN (список значений)".
...
Рейтинг: 0 / 0
INSERT + SELECT + пользовательские значения
    #38692961
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите пожалуйста еще по такому моменту: в "основной" таблице для select'a `nktb` и в таблице `p_orders` может быть несколько строк, подходящих под условия выборки. У этих двух таблиц есть одинаковое поле-ссылка на третью таблицу `smetytb`.
`nktb` - таблица с оборудованием, которое выписывается на смету
`p_orders` - таблица с "деньгами", которые платятся по той же смете, по которой мы выбрали оборудование
`smetytb` - сам таблица смет, здесь нам нужна только сумма сметы

Соответственно должно происходить следующее:
- допустим в нужном месяце есть 2 строки в `nktb`, подходящие под условия выборки, нам нужно выдернуть из них id сметы и суммировать поле, назовем его `price`
- далее идем в таблицу `p_orders`, ищем там строки подходящие под условия выборки и с id сметы таким же, как и в предыдущей выборке, и суммируем поля с названием, например `pay`
- идем с таблицу `smetytb` и выдергиваем значение поля `smeta_price` с уже выбранным выше id
В идеале скрестить это с insert'ом из первого поста.

Как-то так, надеюсь понятно объяснил. С утра пытаюсь нечто подобное изобразить, но ничего не получается, мозг уже почти взорвался :(
...
Рейтинг: 0 / 0
INSERT + SELECT + пользовательские значения
    #38692971
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglir, спасибо, вариант со вставкой значения в сам SELECT не догадался попробовать!
По второму вопросу интересовала сама структура запроса, так же благодарю за комментарий!
...
Рейтинг: 0 / 0
INSERT + SELECT + пользовательские значения
    #38692995
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korshun, ещё:
Код: sql
1.
`city`.`city` + ', ' + `street`.`street`

в мускле ЕМНИП работать не будет, используйте concat()

korshunв "основной" таблице для select'a `nktb` и в таблице `p_orders` может быть несколько строк, подходящих под условия выборки. У этих двух таблиц есть одинаковое поле-ссылка на третью таблицу `smetytb`вопрос:
оборудование-сметы
оборудование-заказы
заказы-сметы
что с чем как связано?
Насколько я понимаю, должно быть: заказ (1-1(М?)) смета (1-М) оборудование. Но вы как-то непонятно написали.
ЯНП, почему "оборудование" выставлено основной таблицей. Что, есть такое оборудование, которое связано с заказами, но не со сметами? А как, если korshunУ этих двух таблиц есть одинаковое поле-ссылка на третью таблицу `smetytb`?
...
Рейтинг: 0 / 0
INSERT + SELECT + пользовательские значения
    #38693126
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делается все так, распишу по пунктам:
1. Создается смета (таблица `smetytb`) на некую сумму, пусть будет 1000 руб. ID сметы пусть будет 1.
2. Клиент может оплатить как всю сумму сразу, так и платить частично. Т.е. сегодня он пришел сам, оплатил наличкой 800 руб., а завтра перевел по безналу оставшиеся 200 руб.
На каждый платеж составляется форма и привязывается к нужной смете (таблица `p_orders`), т.е. в данном случае получится 2 записи в таблице `p_orders`, ссылающихся на смету с ID 1. Но оплата может быть не 800+200, а 300+200, то-есть будет долг, для этого и нужна сумма по определенному полю всех записей.
3. Со склада выписывается оборудование (таблица `nktb`) так же на смету из п.1. Чуть позже может быть выписано еще что-то на ту же смету, потом еще и т.д., то-есть получается несколько записей в `nktb`, ссылающихся на `smetytb`.`id` = 1. Тут так же нужна сумма по определенному полю всех записей.
В итоге для формирования строки для INSERT'а в таблицу `realiz` нужно получить:
а) Сумму взятого оборудования
б) Сумму поступивших оплат
в) Сумму сметы

Таблица `realiz` формируется за предыдущий месяц по данным из таблицы `nktb`. Алгоритм такой:
- Идем в `nktb`, ищем записи за 6й месяц (Июнь)
- Поле с суммой у записей, у которых поле `nktb`.`idsm` (ссылка на смету) одинаковое, каким-то образом суммируем и далее ..
- ... идем в `p_orders`, ищем записи за тот же месяц (6й) и с таким же полем-ссылкой на смету `p_orders`.`idsm`, и так же каким-то образом суммируем поле с суммой
- Далее уже выдергивается сумма сметы, остальная информация и осуществляется вставка в таблицу `realiz`.

Т.е. через несколько запросов это делается без проблем, но хотелось бы, если есть такая возможность, сделать одним запросом.

На всякий случай прикрепляю скрин из phpmyadmin'а
...
Рейтинг: 0 / 0
INSERT + SELECT + пользовательские значения
    #38693128
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglir, да, спасибо за concat(), даже не заметил, что NULL'и вставляются вместо данных!
...
Рейтинг: 0 / 0
INSERT + SELECT + пользовательские значения
    #38693156
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот, у вас оборудование ссылается на смету и заказы тоже ссылаются на смету. Почему тогда смета стоит справа, а оборудование - слева в лефтджойне? Надо либо наоборот, либо вообще должен быть иннерджойн.
Подумайте, какой получится результат, если в выбранный период прошли оплаты по сметам, созданным в другой период :)

korshunВ итоге для формирования строки для INSERT'а в таблицу `realiz` нужно получить:
а) Сумму взятого оборудования
б) Сумму поступивших оплат
в) Сумму сметы
3)?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select id
 ,t1.q
 ,t2.q
 ,rursum
from smetytb s
left join (
 select nkidsm,sum(nksummout) q from nktb
) t1 on s.id=t1.nkidsm
left join (
select idsm,sum(itogo) q from p_orders
) t2 on s.id=t2.idsm

добавить условий по вкусу

PS. Получается, в вашей схеме невозможно определить, оплачено ли конкретное оборудование, если смете соответствует несколько единиц оборудования и она оплачена не полностью. Я правильно понимаю?
...
Рейтинг: 0 / 0
INSERT + SELECT + пользовательские значения
    #38693197
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смета сама по себе тут вообще не при чем, смета может присутствовать в таблице `smetytb` без всяких "движений" по ней.
Таблица `realiz` формируется на основании либо оплат (данных из `p_orders`), либо на основании взятого оборудования (таблица `nktb`) за предыдущий месяц.
Получается даже так (не отразил это в предыдущем посте), что нужно одновременно делать выборку и из `nktb`, и из `p_orders` - это можно сделать с помощью INNER JOIN, верно ?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SELECT 
	`nktb`.`nknum` AS `nknum`,
	`nktb`.`nksummout` AS `nksumm`,
	`p_orders`.`ordnum` AS `ordnum`,
	`p_orders`.`itogo` AS `paysumm`,
	`smetytb`.`smnum` AS `smnum`,
	`smetytb`.`rursum` AS `smsumm`
FROM `nktb` 
INNER JOIN `p_orders` ON `p_orders`.`idsm` = `nktb`.`nkidsm`
			AND DATE_FORMAT(`p_orders`.`cr_date`,'%c') = '6' 
                    	AND `p_orders`.`podtype` IN ('7', '9', '11', '14', '18', '19', '25')
LEFT JOIN `smetytb` ON `smetytb`.`id` = `nktb`.`nkidsm`
WHERE `nktb`.`nksummin` IS NULL
  AND `nktb`.`nkidsm` IS NOT NULL
  AND DATE_FORMAT(`nktb`.`crdate`,'%c') = '6' 
  AND DATE_FORMAT(`nktb`.`crdate`,'%Y') = '2014'
  AND `nktb`.`nkindgr` IN ('9', '47', '68')



Результат на картинке
Но остается открытым вопрос, как в этом же запросе сосчитать сумму и по нескольким записям в `nktb`, и по нескольким записям в `p_orders` (в примере повторяющиеся записи выпали в `p_orders`)
...
Рейтинг: 0 / 0
INSERT + SELECT + пользовательские значения
    #38693202
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UPD. То, что на картинке ordnum у выделенный строк одинаковые - это баг: правил записи руками, не обратил внимания. Они разными на самом деле должны быть, т.е. 9 и 11 например
...
Рейтинг: 0 / 0
INSERT + SELECT + пользовательские значения
    #38693239
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
C INNER JOIN я конечно погорячился :) Совсем голова уже не соображает :(
...
Рейтинг: 0 / 0
INSERT + SELECT + пользовательские значения
    #38693587
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korshunСмета сама по себе тут вообще не при чем, смета может присутствовать в таблице `smetytb` без всяких "движений" по ней.Ещё раз: у вас и в оборудовании, и в оплатах присутствуют ссылки на таблицу смет. Эти поля могут быть NULL или нет?
...
Рейтинг: 0 / 0
INSERT + SELECT + пользовательские значения
    #38693705
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirkorshunСмета сама по себе тут вообще не при чем, смета может присутствовать в таблице `smetytb` без всяких "движений" по ней.
Ещё раз: у вас и в оборудовании, и в оплатах присутствуют ссылки на таблицу смет. Эти поля могут быть NULL или нет?
Могут, но выборку нужно делать только для тех записей с обоих таблицах, где эта ссылка не NULL

На данный момент ничего лучшего придумать не смог.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
SELECT
            `smetytb`.`id` AS `SMID`,
            `smetytb`.`smnum` AS `smnum`,
            `smetytb`.`rursum` AS `smsumm`,
            `nktb`.`crdate` AS `nkcrdate`,
            `nktb`.`nkidsm` AS `NKIDSM`,
            `nktb`.`nknum` AS `nknum`,
            `nktb`.`nksummout` AS `nksumm`,
            `p_orders`.`cr_date` AS `ordcrdate`,
            `p_orders`.`idsm` AS `ORDIDSM`,
            `p_orders`.`ordnum` AS `ordnum`,
            `p_orders`.`itogo` AS `paysumm`
    FROM `nktb`
    LEFT JOIN `p_orders` ON `p_orders`.`idsm` = `nktb`.`nkidsm`
    	AND DATE_FORMAT(`p_orders`.`cr_date`,'%c') = '6'
        AND DATE_FORMAT(`p_orders`.`cr_date`,'%Y') = '2014'
        AND `p_orders`.`podtype` IN ('7', '9', '11', '14', '18', '19', '25')
    LEFT JOIN `smetytb` ON `smetytb`.`id` = `nktb`.`nkidsm`
    WHERE `nktb`.`nksummin` IS NULL
        AND `nktb`.`nkidsm` IS NOT NULL
        AND DATE_FORMAT(`nktb`.`crdate`,'%c') = '6'
        AND DATE_FORMAT(`nktb`.`crdate`,'%Y') = '2014'
        AND `nktb`.`nkindgr` IN ('9', '47', '68')
        
UNION

SELECT
           `smetytb`.`id` AS `SMID`,
            `smetytb`.`smnum` AS `smnum`,
            `smetytb`.`rursum` AS `smsumm`,
            `nktb`.`crdate` AS `nkcrdate`,
            `nktb`.`nkidsm` AS `NKIDSM`,
            `nktb`.`nknum` AS `nknum`,
            `nktb`.`nksummout` AS `nksumm`,
            `p_orders`.`cr_date` AS `ordcrdate`,
            `p_orders`.`idsm` AS `ORDIDSM`,
            `p_orders`.`ordnum` AS `ordnum`,
            `p_orders`.`itogo` AS `paysumm`
    FROM `p_orders`
    LEFT JOIN `nktb` ON `nktb`.`nkidsm` = `p_orders`.`idsm`
    	AND DATE_FORMAT(`nktb`.`crdate`,'%c') = '6'
        AND DATE_FORMAT(`nktb`.`crdate`,'%Y') = '2014'
        AND `nktb`.`nkindgr` IN ('9', '47', '68')
    LEFT JOIN `smetytb` ON `smetytb`.`id` = `p_orders`.`idsm`
    WHERE `p_orders`.`idsm` IS NOT NULL
        AND DATE_FORMAT(`p_orders`.`cr_date`,'%c') = '6'
        AND DATE_FORMAT(`p_orders`.`cr_date`,'%Y') = '2014'
        AND `p_orders`.`podtype` IN ('7', '9', '11', '14', '18', '19', '25')



Выбирает, вроде, то, что надо, но как сосчитать сумму полей в строках, где ссылка на смету одинаковая, но разные номера и убрать дубликаты - хоть убей не понимаю :(
...
Рейтинг: 0 / 0
INSERT + SELECT + пользовательские значения
    #38693934
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korshunМогут, но выборку нужно делать только для тех записей с обоих таблицах, где эта ссылка не NULL
korshunно как сосчитать сумму полей в строках, где ссылка на смету одинаковая, но разные номера и убрать дубликаты - хоть убей не понимаю :(
Ещё раз внимательно читайте мой запрос.
...
Рейтинг: 0 / 0
INSERT + SELECT + пользовательские значения
    #38693958
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirЕщё раз внимательно читайте мой запрос.
Да, извиняюсь, вчера видимо думалка совсем не работала, сегодня на свежую голову стало понятно, что вы предлагаете :) Благодарю!
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / INSERT + SELECT + пользовательские значения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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