Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / 2 различных запроса в одном / 11 сообщений из 11, страница 1 из 1
25.02.2015, 14:56:19
    #38888535
GreenElf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 различных запроса в одном
Ситуация : Есть некий генератор отчетов которому я могу передавать параметры и в нем (в генераторе) написать некий SQL запрос для построения отчета.

Задача : Отчет к примеру Прайс-Лист, но прайс лист может быть по остаткам на складе а может быть общий по всей возможной номенлатуре. Т.е. отчет один но SQL запросы немного отличаются.

Итак проблема : есть запрос который зависит от входных параметров (запрос не верен но логика я думаю понятна):
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
CASE WHEN ('{isNomn}' = '0') THEN
SELECT * FROM (SELECT
	msus.snon_id,
	snon.art,
	snon.naim,
	msus.ost,
	msus.cena,
	msus.cenao,
        snonv.mfoto,
	msus.ost * msus.cenao AS summa,
	GROUP_CONCAT(CONCAT(smcur.naim, ': ', smcgr.naim) SEPARATOR '; ') AS cont_naim
FROM
	ms_msus AS msus
LEFT JOIN op_snon AS snon ON msus.snon_id = snon.id
LEFT JOIN op_snonv AS snonv ON snon.id = snonv.snon_id
LEFT JOIN ms_msusw as msusw ON (msusw.msus_id = msus.id)
LEFT JOIN ms_smcur AS smcur ON msusw.smcur_id = smcur.id
LEFT JOIN ms_smcgr AS smcgr ON msusw.smcgr_id = smcgr.id
WHERE 
msus.ost > 0
AND CASE WHEN ('{spzSID}' = '0') THEN 1=1 ELSE msus.spz_sid IN ({spzSID}) END
GROUP BY
	msus.id
ORDER BY snon.art
) as tmp
ELSE
SELECT * FROM (SELECT
	snon.id,
	snon.art,
	snon.naim,
	0 as ost,
	snon.cena,
	snon.cenao,
        snonv.mfoto,
	0 as summa,
	'' AS cont_naim
FROM
	op_snon AS snon
LEFT JOIN op_snonv AS snonv ON snon.id = snonv.snon_id
WHERE 
1=1
GROUP BY
	snon.id
ORDER BY snon.art
) as tmp
END



Вопрос : можно ли вообще в одном запросе сделать что-то подобное?
{spzSID} и {isNomn} - Это параметры генератора которые преобразуются при построении документа в то что я передаю.
PS: Оба отчета работают по отдельности и возвращают одинаковую структуру данных для построения документа.
...
Рейтинг: 0 / 0
25.02.2015, 16:33:59
    #38888693
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 различных запроса в одном
Реализуй эту фигню в рамках хранимой процедуры. С параметрами...
...
Рейтинг: 0 / 0
25.02.2015, 16:35:10
    #38888696
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 различных запроса в одном
А ещё правильнее - раздели отчёты полностью. Для каждого свой шаблон и свой запрос. Тебе чего, байтов жалко?
...
Рейтинг: 0 / 0
25.02.2015, 16:48:57
    #38888718
GreenElf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 различных запроса в одном
Я пробую реализовать при помощи хранимой процедуры но тут проблема в другом, я ее сразу не описал, пользовательских баз данных - множество и я не могу создать заранее хранимую процедуру т.к. баз данных много и они постоянно добавляются (по мере регистраций новых пользователей), а печать документов постоянно дополняется новыми шаблонами, кроме того если меняется внешний вид какого-то документа, то при наличии клонов - нужно и в них менять т.е. клонировать однотипные документы не вариант.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
DELIMITER |
DROP PROCEDURE IF EXISTS `proc_get_price` |
CREATE PROCEDURE `proc_get_price` (nomn INT, spzid INT)
BEGIN 
	IF (nomn = 0) THEN 
		SELECT '1';
	ELSE 
		SELECT '2';
	END IF;
END; |
DELIMITER ;
CALL proc_get_price(0, 0);


Да и запрос такого вида не хочет работать в шаблонизаторе, вероятно процедуры у них не поддерживаются.
...
Рейтинг: 0 / 0
25.02.2015, 17:20:34
    #38888756
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 различных запроса в одном
GreenElf
Код: sql
1.
CASE WHEN ('{spzSID}' = '0') THEN 1=1 ELSE msus.spz_sid IN ({spzSID}) END

Код: sql
1.
('{spzSID}' = '0' OR msus.spz_sid IN ({spzSID}))
...
Рейтинг: 0 / 0
25.02.2015, 20:19:59
    #38888899
GreenElf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 различных запроса в одном
miksoftGreenElf
Код: sql
1.
CASE WHEN ('{spzSID}' = '0') THEN 1=1 ELSE msus.spz_sid IN ({spzSID}) END

Код: sql
1.
('{spzSID}' = '0' OR msus.spz_sid IN ({spzSID}))



Да, спасибо, очевидное поправлено, однако основное остается под вопросом
...
Рейтинг: 0 / 0
26.02.2015, 08:15:00
    #38889069
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 различных запроса в одном
AkinaРеализуй эту фигню в рамках хранимой процедуры. С параметрами...

+1
...
Рейтинг: 0 / 0
26.02.2015, 08:15:47
    #38889070
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 различных запроса в одном
AkinaА ещё правильнее - раздели отчёты полностью. Для каждого свой шаблон и свой запрос. Тебе чего, байтов жалко?
+10
...
Рейтинг: 0 / 0
26.02.2015, 08:20:00
    #38889071
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 различных запроса в одном
GreenElf,

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

залить одну и ту же процедуру в разные бд - не большая проблема. можно написать скрипт...
...
Рейтинг: 0 / 0
26.02.2015, 09:39:44
    #38889126
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 различных запроса в одном
Можно извратиться:
Код: sql
1.
2.
3.
SELECT ... FROM ... WHERE ... AND '{isNomn}' = '0'
UNION ALL
SELECT ... FROM ... WHERE ... AND '{isNomn}' <> '0'

Только набор полей в обоих SELECT-ах должен строго совпадать по количеству и порядку типов.
...
Рейтинг: 0 / 0
26.02.2015, 11:34:50
    #38889253
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 различных запроса в одном
miksoftМожно извратиться:
Код: sql
1.
2.
3.
SELECT ... FROM ... WHERE ... AND '{isNomn}' = '0'
UNION ALL
SELECT ... FROM ... WHERE ... AND '{isNomn}' <> '0'

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


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