Консультация № 186813
14.11.2012, 14:19
79.10 руб.
0 1 1
Здравствуйте! У меня возникли сложности с таким вопросом:

Есть две таблицы. В одной хранятся названия групп компьютеров и их IP (все IP каждой группы лежат в текстовом поле, обрамлённые двойными кавычками и разделённые запятой). Во второй таблице ведётся учёт интернет-трафика, в каждой строке представлен IP и кол-во израсходованных интернет-байтов.
Вопрос: как написать встроенную функцию, которая берёт значение из поля IP группы и суммирует из второй таблицы байты только этой группы. Я пробовал так:
Код:

//В функцию передаётся идентификатор группы
CREATE FUNCTION SummaFromLog(ids INTEGER)
RETURNS NUMERIC(15,2)
COMMENT 'Возвращает сумму Мбайт для указанного списка IP'
BEGIN
DECLARE mySum NUMERIC(15,2);
DECLARE myComps VARCHAR(255);

//Согласно идентификатору получаем список IP группы
//В переменной myComps получается что-то вроде этого:
//"192.168.0.1","192.168.0.2","192.168.0.3"
SELECT comps INTO myComps FROM otdels WHERE id = ids;

//Теперь делаем выборку суммы байтов
SELECT SUM(bytesin) INTO mySum FROM log WHERE client IN (myComps);

RETURN mySum;
END

Однако в результате вместо суммы я всегда получаю NULL. Но если вторую выборку написать так:
SELECT SUM(bytesin) INTO mySum FROM log WHERE client IN ("192.168.0.1","192.168.0.2","192.168.0.3");
то возвращается правильная сумма.
Какие будут рекомендации?

Обсуждение

давно
Старший Модератор
312929
1973
14.11.2012, 16:45
общий
это ответ
Здравствуйте, sir Henry!

Попробуйте вместо двух SELECT использовать один примерно такого вида:
[code lang=sql]SELECT SUM(bytesin) INTO mySum FROM log LEFT JOIN otdels ON FIND_IN_SET(client, REPLACE(comps,'"','')) WHERE id=ids[/code]
5
Большое спасибо! Работает...
Форма ответа