Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.01.2023, 10:49   #1
NExTreem
Новичок
Джуниор
 
Регистрация: 26.01.2023
Сообщений: 4
По умолчанию Сложный SQL-запрос

Уважаемые знатоки SQL!
Имею следующий сложный SQL-запрос:
$sql= "SELECT src,dst,lastapp,substring(channel,1 ,locate("-",channel,1)-1) AS chan1, ";
$sql.="substring(dstchannel,1,locat e("-",dstchannel,1)-1) AS chan2, ";
$sql.="billsec, calldate,j1.dial,j2.dial,if(j1.dial is not null and j2.dial is null,'outbound','') as outbound, ";
$sql.="if(j1.dial is null and j2.dial is not null,'inbound','') AS inbound, ";
$sql.="if(j1.dial is not null and j2.dial is not null,'internal','') as internal ";
$sql.="FROM asteriskcdrdb.cdr LEFT JOIN asterisk.devices as j2 on substring(dstchannel,1,locate("-",dstchannel,1)-1) = j2.dial ";
$sql.="LEFT JOIN asterisk.devices as j1 on substring(channel,1,locate("-",channel,1)-1) = j1.dial WHERE calldate>curdate() AND billsec>0 AND disposition='ANSWERED' ";
$sql.="HAVING (outbound<>'' OR inbound<>'' OR internal<>'') AND chan2<>'' ORDER BY calldate DESC";

Задачка у меня следующая:
В столбце asterisk.devices.dial по умолчанию находится запись вида "SIP/XXX", а в моем случае, она может быть как дефолтного вида, так и такой: "SIP/XXX&SIP/trunk/XXX".
Сейчас имеющийся запрос надо изменить таким образом, чтобы в запросе осуществлялась проверка на наличие в записи этого столбца символа "&", в случае наличия, из asterisk.devices.dial нужно выбирать не всю запись целиком, а только подстроку от начала и ДО символа &

Пробую j1.dial и j2.dial менять на следующие конструкции соответственно:
substring(j1.dial,1,if(locate("&",j 1.dial,1)>0, locate("&",j1.dial,1)-1, lenght(j1.dial)))
substring(j2.dial,1,if(locate("&",j 2.dial,1)>0, locate("&",j2.dial,1)-1, lenght(j2.dial)))

В приведенных мною конструкциях я пытаюсь брать подстроку из записи dial, задавая в качестве длины подстроки, в зависимости от выполнения проверки наличия символа &, либо длину подстроки ДО символа &, либо ВСЮ длину записи...

Запрос запускается из скрипта на PHP, поэтому двойные кавычки в запросе экранируются обратным слэшем... Но здесь обратный слэш убирается при сохранении сообщения

MySQL выдает ошибку синтаксиса, в которой ругается на отсутствие функции asterisk.lenght
Голова пухнет - что-то делаю не так

Может кто-то из знатоков подтолкнуть меня в нужном направлении - кудыть рыть?

Последний раз редактировалось NExTreem; 26.01.2023 в 11:04.
NExTreem вне форума Ответить с цитированием
Старый 26.01.2023, 12:20   #2
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 493
По умолчанию

запрос кровь из глаз...

Цитата:
Сообщение от NExTreem Посмотреть сообщение
MySQL выдает ошибку синтаксиса, в которой ругается на отсутствие функции asterisk.lenght
Уверены?
Зачем говорить об ошибке на пальцах, если можно скопировать текст ошибки?
Valick вне форума Ответить с цитированием
Старый 26.01.2023, 14:19   #3
NExTreem
Новичок
Джуниор
 
Регистрация: 26.01.2023
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Valick Посмотреть сообщение
запрос кровь из глаз...


Уверены?
Зачем говорить об ошибке на пальцах, если можно скопировать текст ошибки?
Вот текст ошибки "как есть", запрос просто уже немного изменил в поисках рабочего варианта, но ответ остался тем же:

sql=SELECT src,dst,lastapp,substring(channel,1 ,locate("-",channel,1)-1) AS chan1, substring(dstchannel,1,locate("-",dstchannel,1)-1) AS chan2, billsec, calldate, substring(j1.dial,1,if(locate("&",j 1.dial,1)>0, locate("&",j1.dial,1)-1, lenght(j1.dial))), substring(j2.dial,1,if(locate("&",j 2.dial,1)>0, locate("&",j2.dial,1)-1,lenght(j2.dial))) ,if(j1.dial is not null and j2.dial is null,'outbound','') as outbound, if(j1.dial is null and j2.dial is not null,'inbound','') AS inbound, if(j1.dial is not null and j2.dial is not null,'internal','') as internal FROM asteriskcdrdb.cdr LEFT JOIN asterisk.devices as j2 on substring(dstchannel,1,locate("-",dstchannel,1)-1)=substring(j2.dial,1,if(locate("& ",j2.dial,1)>0,locate("&",j2.dial,1 )-1,lenght(j2.dial))) LEFT JOIN asterisk.devices as j1 on substring(channel,1,locate("-",channel,1)-1)=substring(j1.dial,1,if(locate("& ",j1.dial,1)>0,locate("&",j1.dial,1 )-1,lenght(j1.dial))) WHERE calldate>curdate() AND billsec>0 AND disposition='ANSWERED' HAVING (outbound<>'' OR inbound<>'' OR internal<>'') AND chan2<>'' ORDER BY calldate DESC

SQLSTATE[42000]: Syntax error or access violation: 1305 FUNCTION asterisk.lenght does not exist

Последний раз редактировалось NExTreem; 26.01.2023 в 16:48.
NExTreem вне форума Ответить с цитированием
Старый 26.01.2023, 14:29   #4
NExTreem
Новичок
Джуниор
 
Регистрация: 26.01.2023
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Valick Посмотреть сообщение
запрос кровь из глаз...
Согласен с Вами - на все 100%, но имеем то, что имеем
NExTreem вне форума Ответить с цитированием
Старый 26.01.2023, 18:00   #5
NExTreem
Новичок
Джуниор
 
Регистрация: 26.01.2023
Сообщений: 4
По умолчанию

Ошибка у меня орфографическая, правильно пишется length. Я последние буквы поменял местами.
Вот что значит - глаз замылился уже
NExTreem вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сложный запрос SQL irina1410 БД в Delphi 4 03.07.2012 16:46
Сложный запрос templton Microsoft Office Access 8 21.04.2011 13:43
Сложный запрос в SQL A-Lex-Is SQL, базы данных 1 10.08.2010 23:19
Сложный запрос Lianchik Помощь студентам 1 01.03.2010 17:16
сложный sql запрос kate158 БД в Delphi 0 18.09.2008 11:38