Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Подскажите, пожалуйст. Из двух запросов один запрос / 12 сообщений из 12, страница 1 из 1
19.02.2015, 06:21:32
    #38883474
katyad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите, пожалуйст. Из двух запросов один запрос
Есть запрос, который как оказалось работает не верно.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Select material.kod, material.kol_vo - sum(IFNULL(prixod.kol,0)) + sum(IFNULL(spravka_mat.kol,0))+sum(IFNULL(spisan.kol,0)) as statok1, 
sum(IFNULL(prixod.kol,0)) as prixod, 
	   sum(IFNULL(spravka_mat.kol,0))+sum(IFNULL(spisan.kol,0)) as rasxod, material.kol_vo as ostatok2, 

material_group.naim_group
				FROM material
							LEFT JOIN material_group ON 

material.group_mat=material_group.id
							LEFT JOIN spravka_mat ON 

spravka_mat.izrasx_mat=material.kod
							LEFT JOIN spravka ON spravka.kod=spravka_mat.kod_sp
							LEFT JOIN prixod on prixod.izrasx_mat=material.kod
							LEFT JOIN spisan on spisan.naim_mat=material.kod
							WHERE ((spravka.kod is null or 

(spravka.data>='2015-02-01' and spravka.data<='2015-02-28'))
							  AND (prixod.kod is null or (prixod.data>='2015-02-01' 

and prixod.data<='2015-02-28')) 
							  AND (spisan.id is null or (spisan.date>='2015-02-01' 

and spisan.date<='2015-02-28'))
...
Рейтинг: 0 / 0
19.02.2015, 06:23:39
    #38883476
Подскажите, пожалуйст. Из двух запросов один запрос
вопро, собственно, в чем?
...
Рейтинг: 0 / 0
19.02.2015, 06:32:18
    #38883479
katyad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите, пожалуйст. Из двух запросов один запрос
Данный запрос выдает результаты:
material.kod; statok1; prixod; ostatok2
331 -15 30 2

А должно быть
331 0 15 2
Т.е. prixod увеличивается в 2 раза, как только ostatok2 >1 (в таблице spravka_mat есть две записи по данному material.kod, а в prixod одна запись.)
Есть идея разделить данный запрос на 3 запроса. Но не знаю как потом собрать их.
1 запрос:
Код: sql
1.
2.
3.
4.
5.
Select material.kod, sum(IFNULL(prixod.kol,0)) as prixod
				FROM material
							LEFT JOIN material_group ON material.group_mat=material_group.id
							LEFT JOIN prixod on prixod.izrasx_mat=material.kod
							WHERE (prixod.kod is null or (prixod.data>='2015-02-01' and prixod.data<='2015-02-28')) 


2 запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Select material.kod, 
sum(IFNULL(spravka_mat.kol,0))+sum(IFNULL(spisan.kol,0)) as rasxod
				FROM material
							LEFT JOIN material_group ON material.group_mat=material_group.id
							LEFT JOIN spravka_mat ON spravka_mat.izrasx_mat=material.kod
							LEFT JOIN spravka ON spravka.kod=spravka_mat.kod_sp
							LEFT JOIN spisan on spisan.naim_mat=material.kod
							WHERE ((spravka.kod is null or (spravka.data>='2015-02-01' and spravka.data<='2015-02-28'))
							  AND (spisan.id is null or (spisan.date>='2015-02-01' and spisan.date<='2015-02-28'))
                                                          AND material.kod='331') 


3 запрос типа:
Код: sql
1.
2.
3.
4.
5.
6.
7.
Select material.kod, material.kol_vo - sum(IFNULL(prixod.kol,0)) + sum(IFNULL(spravka_mat.kol,0))+sum(IFNULL(spisan.kol,0)) as ostatok1, 
Из select1 as prixod, 
Из Select2 as rasxod, 
material.kol_vo as ostatok2, material_group.naim_group
				FROM material
							GROUP BY material.kod, material.naim_mat, material.ed_izm, material.kol_vo
							ORDER BY material.group_mat, material.naim_mat
...
Рейтинг: 0 / 0
19.02.2015, 06:42:06
    #38883481
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите, пожалуйст. Из двух запросов один запрос
katyad,


в сами запросы вникать настроения нет, поэтому
чисто абстрактно:

1. не усложняйте без нужды.
если сложный запрос можно разделить и несколько
правильных, понятных и быстрых запроса -- так и хорошо!

2. несклько лефт жоинтов подряд -- ждите подвоха
в умножении результат -- промерно как у вас получилось.
раделяйте опасные (с многими записаями слева) лефт жоинты
груп-баями.

т.е. для сличая связки ОТ родилетя х НА детей у , з вместo

x left join y on .....
left join z on.....
group by

используйте

(
x left join y on ....
group by .....
)
left join z on ....
group by ......
...
Рейтинг: 0 / 0
19.02.2015, 06:43:16
    #38883482
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите, пожалуйст. Из двух запросов один запрос
поправка:

...раделяйте опасные (с многими записями СПРАВА) лефт жоинты...
...
Рейтинг: 0 / 0
19.02.2015, 07:49:34
    #38883500
katyad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите, пожалуйст. Из двух запросов один запрос
Спасибо, решила эту задачу)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SELECT T1.kod, T1.naim_mat, T1.ed_izm, T1.prixod, T2.rasxod, T1.kol_vo - T1.prixod + T2.rasxod as ostatok1, T1.kol_vo as ostatok2, T1.naim_group
                      FROM
						(SELECT material.kod, material.naim_mat, material.ed_izm, sum(IFNULL(prixod.kol,0)) AS prixod, material.kol_vo, material_group.naim_group
							FROM material
							LEFT JOIN prixod on prixod.izrasx_mat=material.kod
							LEFT JOIN material_group ON material.group_mat=material_group.id
							WHERE (prixod.kod is null or (prixod.data>='$s2' and prixod.data<='$po2'))
							GROUP BY material.kod, material.naim_mat, material.ed_izm, material.kol_vo
							ORDER BY material.group_mat, material.naim_mat
						) T1,
						(SELECT material.kod, sum(IFNULL(spravka_mat.kol,0))+sum(IFNULL(spisan.kol,0)) AS rasxod
							FROM material
							LEFT JOIN spravka_mat ON spravka_mat.izrasx_mat=material.kod
							LEFT JOIN spravka ON spravka.kod=spravka_mat.kod_sp
							LEFT JOIN spisan on spisan.naim_mat=material.kod
							WHERE (spravka.kod is null or (spravka.data>='$s2' and spravka.data<='$po2'))
							AND (spisan.id is null or (spisan.date>='$s2' and spisan.date<='$po2'))    
							GROUP BY material.kod
						) T2
					WHERE T2.kod = T1.kod
					ORDER BY T1.naim_group, T1.naim_mat
...
Рейтинг: 0 / 0
19.02.2015, 08:05:05
    #38883507
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите, пожалуйст. Из двух запросов один запрос
katyad, ордербай в подзапросе уберите, от него там толку ноль.
...
Рейтинг: 0 / 0
19.02.2015, 08:20:55
    #38883514
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите, пожалуйст. Из двух запросов один запрос
javajdbc1. не усложняйте без нужды.
если сложный запрос можно разделить и несколько
правильных, понятных и быстрых запроса -- так и хорошо!


Это вредный совет. Во-первых, запрос нифига не сложный --- простейший.
Во-вторых -- НЕ НАДО разделять запросы. Это плохо в 90% случаев.
...
Рейтинг: 0 / 0
19.02.2015, 08:24:45
    #38883518
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите, пожалуйст. Из двух запросов один запрос
katyad,

У тебя тут какая-то несуразица с логикой запроса.

Все JOIN-ы -- внешние. Но опционально накладываются какие-то фильтры:

Код: sql
1.
2.
3.
WHERE ((spravka.kod is null or (spravka.data>='2015-02-01' and spravka.data<='2015-02-28'))
  AND (prixod.kod is null or (prixod.data>='2015-02-01' and prixod.data<='2015-02-28')) 
  AND (spisan.id is null or (spisan.date>='2015-02-01' and spisan.date<='2015-02-28'))



На самом деле все эти фильтры должны быть ВНУТРИ JOIN , в фразе ON .
...
Рейтинг: 0 / 0
19.02.2015, 09:10:45
    #38883543
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите, пожалуйст. Из двух запросов один запрос
MasterZivЭто вредный совет.
[skipped]
НЕ НАДО разделять запросы. Это плохо в 90% случаев.
На этапе написания и отладки - не только можно, но и нужно. Анализ результатов работы подзапросов/вьювов позволяет отловить логические ляпы, неловимые на конечном многоэтажном безобразии. А собрать один запрос из цепочки несложно - нужна только аккуратность.
...
Рейтинг: 0 / 0
19.02.2015, 09:12:13
    #38883544
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите, пожалуйст. Из двух запросов один запрос
MasterZivВсе JOIN-ы -- внешние. Но опционально накладываются какие-то фильтры:Может, человеку и в самом деле нужен INNER JOIN - просто он не знает, что такое существует. Нередкое, кстати, явление.
...
Рейтинг: 0 / 0
19.02.2015, 16:35:35
    #38884203
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите, пожалуйст. Из двух запросов один запрос
AkinaMasterZivЭто вредный совет.
[skipped]
НЕ НАДО разделять запросы. Это плохо в 90% случаев.
На этапе написания и отладки - не только можно, но и нужно. Анализ результатов работы подзапросов/вьювов позволяет отловить логические ляпы, неловимые на конечном многоэтажном безобразии. А собрать один запрос из цепочки несложно - нужна только аккуратность.


Акина: угу, имено!

МастерЗив: не надо говорить абстракциями, хорошо-плохо зависит от
задания... на обязательном первом месте стоит логика/функционал, потом скорость но
иногда есть еше и другие веши, типа опытность работника,
отведеное на решение время, читабельность кода и .т.д.

Единый громадный селект улучшит только (да важную) позицию скорости.
Все остальное не выигрывает.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Подскажите, пожалуйст. Из двух запросов один запрос / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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